我可以从NSHTTPURLResponse中的HTTP状态行访问“Reason Phrase”(原因短语)吗?

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

我正在构build一个iPhone应用程序,即使用NSURLConnection通过HTTP访问数据。 我可以毫无问题地得到HTTP状态码,但是我怎样才能访问“Reason Phrase”?

这是我的连接:didReceiveResponse:方法

- (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”。

这个例子也给了我想要做的一些提示。 我正在构build一个类似REST的API,因此,我应该使用HTTP状态代码来指示错误。 但HTTP状态代码是为HTTP而不是我的应用程序发明的,所以我尝试将额外的信息塞入到Reason Phrase中。

跟上以前的评论(这不是你正在寻找的答案)。

HTTP规范(RFC 2616)规定了状态码和原因短语 :

状态码是供自动机使用的,原因短语是供人类用户使用的。 客户不需要检查或显示原因词组。

从文本中可以清楚地看到,不应该期望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)。 状态码412也与基于标题的前置条件(您可能正在使用的)相当具体相关:

在服务器上testing时,在一个或多个请求头字段中给出的前提条件评估为false。 此响应代码允许客户端将当前资源元信息(头字段数据)的先决条件放置,从而防止将所请求的方法应用于除预期的资源之外的资源。

类方法localizedStringForStatusCode:在NSHTTPURLResponse上会得到一个针对在响应中接收到的状态码的本地化短语。