【问题标题】:Consume ASP web service with JSON response on iOS在 iOS 上使用带有 JSON 响应的 ASP Web 服务
【发布时间】:2013-12-19 18:13:05
【问题描述】:

我正在尝试调用使用 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 格式返回响应。

我想知道我是否在这里遗漏了什么,因为我既没有收到错误也没有成功日志?

任何帮助将不胜感激!

谢谢。

花岗岩

【问题讨论】:

  • 响应格式如下 { "Success":true, "Message":"", "Response":"" }
  • 您是否知道您的请求是否被收到。如果是这样,您知道实际发生了什么吗?

标签: ios json web-services


【解决方案1】:

一些想法:

  1. 如果这个方法被调用,你会看到一些东西,即使retVal 是空的并且你的

    NSLog(@"%@", retVal);
    

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

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

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

  2. 您对自己的服务器界面有信心吗?例如,SignInOperation 值是否可能属于 JSON 请求本身?此外,某些服务区分大小写,因此您可能也需要检查一下。

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

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

    NSURLResponse *theResponse = nil;
    

    sendSynchronousRequest 调用不会填充现有的 NSURLResponse 实例,而是创建一个新实例并更新 theResponse 以指向它。

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

【讨论】:

    【解决方案2】:

    我通过使用 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]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多