在iOS上使用带有JSON响应的ASP Web服务

时间:2013-12-19 18:13:06

标签: ios json web-services

我正在尝试调用使用ASP.NET开发的Web服务。目的是将用户名和密码传递给Web服务以模拟登录过程。

为了调用服务,我使用了以下方法:

 NSError *errorReturned = nil;
    NSString *urlString = @"http:myDomain/myMethod?Operation=SignIn";
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod: @"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:@"test" forKey:@"userName"];
    [dict setObject:@"test" forKey:@"passWord"];

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions     error:&errorReturned];
    [request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody: jsonData];

    NSURLResponse *theResponse =[[NSURLResponse alloc]init];
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&theResponse error:&errorReturned];

    if (errorReturned)
    {
        NSLog(@"%@", errorReturned);
    }
    else
    {
        NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", retVal);

    }

运行应用程序并单击触发上述方法的UIButton后,控制台窗口中不会显示任何内容。

服务以JSON格式返回响应。

我想知道我是否遗漏了一些东西,因为我既没有收到错误也没有成功登录?

任何帮助将不胜感激!

谢谢。

花岗岩

2 个答案:

答案 0 :(得分:1)

有几点想法:

  1. 如果调用此方法,即使retVal为空且您的

    ,您也会看到一些内容
    NSLog(@"%@", retVal);
    

    刚刚记录了应用名称和时间戳。也许将NSLog更改为

    NSLog(@"retVal = %@", retVal);
    

    消除任何歧义。或者在代码中加入断点并单步执行它以查看应用程序采用的路径。

  2. 您对服务器界面有信心吗?例如,Operation的{​​{1}}值是否可能属于JSON请求本身?此外,某些服务区分大小写,因此您可能也想检查它。

    我不知道您对服务器有什么访问权限,但是检查日志以确保收到请求是值得的,可能会在代码中临时添加一些日志记录,这样您就可以确认参数都是收到得当。或者,如果没有别的,请确保服务器正确记录/报告任何错误。

  3. 顺便说一句,您SignIn的实例化是不必要的,应该只是

    theResponse

    NSURLResponse *theResponse = nil; 调用不会填充现有sendSynchronousRequest实例,而是创建新实例并更新NSURLResponse以指向它。

  4. 您应首先修复您的请求,但您可能希望至少将其更改为使用theResponse而不是sendAsynchronousRequest。你永远不应该在主线程上进行同步调用。

答案 1 :(得分:0)

我通过使用ASIHHTPRequest解决了我的问题。此外,我检查了服务器界面,结果发现必须使用URL发送参数。

-(void)signInAction:(id)sender{

    NSURL *url = [NSURL URLWithString:@"http://mydomaain.com/UserService/SignIn/test/test"];

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    [request setDidFinishSelector:@selector(requestCompleted:)];
    [request setDidFailSelector:@selector(requestError:)];

    [request setDelegate:self];
    [request setRequestMethod:@"GET"];
    [request startAsynchronous];
}

- (void)requestCompleted:(ASIHTTPRequest *)request
{
    NSString *responseString = [request responseString];
    //[responseString UTF8String];
    NSLog(@"ResponseString:%s",[responseString UTF8String]);

}

- (void)requestError:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"Error:%@",[error description]);
}