iOS HTTP请求 - 获取错误响应消息

时间:2013-05-23 08:18:55

标签: ios ios6 http-get

这是我对REST api执行GET请求的代码。

如果收到错误,我不确定如何取回邮件:

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    NSURL *URL = [NSURL URLWithString:urlString];
    [request setURL:URL];
    [request setHTTPMethod:@"GET"];

    NSError *err = nil;
    NSHTTPURLResponse *res = nil;
    NSData *retData = [NSURLConnection sendSynchronousRequest:request returningResponse:&res error:&err];
    if (err) // This part is never called.
    {
        NSLog(@"Error: %@", err);
    }
    else
    {
        if (res.statusCode != 200)
        {
//            show the user the status message
            NSLog(@"Error: %@", res); // This part is called

        }
        else
        {

        }
    }

如果不成功,我想收到错误消息。但是永远不会调用if (err)块。虽然状态代码为400,但错误仍为空。

如果成功,我会得到一个json回复。

在上面的代码中,我得到一个400的statusCode

4 个答案:

答案 0 :(得分:1)

未调用错误块,因为仅在发生系统级错误时才会创建错误对象。这不会发生,因为请求已正确发送,服务器发送响应。如果您控制服务器,则应该返回状态代码200并在响应中包含应用程序级别状态代码,这将告诉您的应用程序输入的凭据不正确。

修改

要获取状态消息,您可以使用

+ (NSString *)localizedStringForStatusCode:(NSInteger)statusCode

这是NSHTTPURLResponse类的类方法。

    if (res.statusCode != 200)
    {
//            show the user the status message
        NSLog(@"Error: %@", [NSHTTPURLResponse localizedStringForStatusCode: res.statusCode]); // This part is called

    }

答案 1 :(得分:0)

看看NSError类引用:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/Reference/Reference.html

您可以尝试从localizedDescription记录错误消息。

答案 2 :(得分:0)

您收到此状态代码是因为 - Web服务器(运行Web站点)认为客户端(例如您的Web浏览器或我们的CheckUpDown机器人)发送的数据流“格式错误”,即不遵守HTTP协议完全。因此,Web服务器无法理解请求并处理它

记录关于ios visit this link

的上述问题

答案 3 :(得分:0)

如果您阅读了sendSynchronousRequest的文档......

错误 如果在处理请求时发生错误,则使用Out参数。可能是NULL。

这意味着如果解决请求存在问题(如格式错误的URL),则erro将是有效的NSError对象。

如果可以解析请求,则错误将为NULL并且根据HTTP协议,并且根据您尝试连接的服务器,NSHTTPURLResponse对象将包含有关请求的所有信息。

通常,错误认为每个不同于200的状态代码都是错误,例如,基于REST的API 204意味着空数据,并且在这种情况下请求成功完成但请求的资源只是空数据,这不是错误。

关于你的问题,绝对没错,大多数时候错误是NULL,如果不是意味着在到达目标服务器之前有问题,一般你必须考虑两者,错误并根据服务器你试图谈论状态代码映射,在大多数情况下是REST模式