我可以从NSHTTPURLResponse中的HTTP状态行访问“Reason Phrase”

时间:2011-06-16 12:46:42

标签: iphone ios http nsurlconnection

指定HTTP的RFC 2616说 - 在第6.1.1节 - 状态行的那部分是3位数字状态代码和文本“原因短语”。

我正在构建一个iPhone应用程序,即使用NSURLConnection通过HTTP访问数据。我可以毫无问题地获取HTTP状态代码,但是如何访问“原因短语”?

这是我的连接:didReceiveResponse:method

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

    httpStatusCode = [httpResponse statusCode];
    // Reason Phrase ??
}

具体而言,我并不是指“解释代码xxx的含义”文本。我可以在RFC中查找它,那些是静态的。我的意思是服务器在状态行中生成的文本。这种状态行的一个例子是:

HTTP/1.1 412 ClientAppVersion: 0.10 < 0.11

,原因短语在这里是“ClientAppVersion:0.10 <0.11”。

这个例子也暗示了我要做的事情。我正在构建类似REST的API,因此,我应该使用HTTP状态代码来指示错误。但HTTP状态代码是为HTTP发明的,而不是我的应用程序,所以我尝试将额外的信息塞进原因短语中。

2 个答案:

答案 0 :(得分:4)

跟进之前的评论(这不是你想要的答案)。

HTTP规范(RFC 2616)声明about status codes and reason-phrase

  

状态代码供...使用   自动机和Reason-Phrase是   供人类用户使用。该   客户不需要检查或   显示原因 - 短语。

从文本中可以清楚地看出,不应该期望HTTP客户端读取原因短语。实际上,它通常是可以呈现的本地化版本(如果有的话)(不一定是服务器发送的版本)。

拥有标准和规范(如HTTP)的目的是能够期望不同的兼容实现(例如您的服务器和iOS库)能够互操作。如果弯曲规格,应该会遇到问题。特别是,如果您想要使用的库不能让您访问原因短语,请不要感到惊讶。

我不太确定如何解释你的评论(“我正在弯曲HTTP以使其符合REST的想法。”)我可以向你保证,REST可以使用HTTP实现,而不需要这种弯曲。我不确定你在哪里有这样的想法来弯曲HTTP以适应REST的想法...

如果你想以REST方式实现某些错误原因,那么原因应该在响应消息体中(或者甚至可能在自定义标题中),而不是在原因短语中。即使这是一个纯文本的反应,它也比原因短语更好。例如:

而不是:

HTTP/1.1 412 ClientAppVersion: 0.10 < 0.11

使用:

HTTP/1.1 412 Precondition Failed
Content-Type: text/plain

ClientAppVersion: 0.10 < 0.11

或者也许:

HTTP/1.1 412 Precondition Failed
Content-Type: text/plain
X-My-Error: ClientAppVersion: 0.10 < 0.11

请注意,无论如何都应该返回消息体(除非204)。 Status code 412也与基于标题的前置条件(您可能正在使用)非常具体相关:

  

一个或多个中给出的前提条件   评估的请求标头字段   当它被测试时,它是假的   服务器。此响应代码允许   客户在上面放置先决条件   当前资源元信息   (标题字段数据)因而防止   要求的方法来自   应用于除以外的资源   一个打算。

答案 1 :(得分:0)

类方法localizedStringForStatusCode:on NSHTTPURLResponse将为您提供响应中收到的状态代码的本地化短语。