指定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发明的,而不是我的应用程序,所以我尝试将额外的信息塞进原因短语中。
答案 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将为您提供响应中收到的状态代码的本地化短语。