0

这是我对 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)块永远不会被调用。err 仍然为空,尽管状态码是 400。

如果成功,我会得到一个 json 响应。

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

4

4 回答 4

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

    }
于 2013-05-23T08:38:26.637 回答
0

看一下 NSError 类参考:

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

您可以尝试从本地化描述中记录错误消息。

于 2013-05-23T08:23:29.313 回答
0

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

要记录有关 ios 的上述问题,请访问此链接

于 2013-05-23T08:24:06.073 回答
0

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

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

这意味着 erro 将是一个有效的 NSError 对象,以防解决请求时出现问题,例如格式错误的 URL。

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

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

因此,关于您的问题,大多数情况下错误为 NULL 绝对没问题,如果这并不意味着在到达目标服务器之前存在问题,那么通常您必须同时考虑错误并根据您正在尝试的服务器谈论状态代码映射,在大多数情况下是 REST 模式

于 2013-05-23T09:49:01.887 回答