pol*_*sen 6 iphone http nsurlconnection ios
指定HTTP的RFC 2616表示 - 在6.1.1节中 - 状态行的那部分是3位数字状态代码和文本"原因短语".
我正在构建一个iPhone应用程序,即使用NSURLConnection通过HTTP访问数据.我可以毫无问题地获取HTTP状态代码,但是如何访问"原因短语"?
这是我的连接:didReceiveResponse:方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
httpStatusCode = [httpResponse statusCode];
// Reason Phrase ??
}
Run Code Online (Sandbox Code Playgroud)
具体而言,我并不是指"解释代码xxx的含义"文本.我可以在RFC中查找它,那些是静态的.我的意思是服务器在状态行中生成的文本.这种状态行的一个例子是:
HTTP/1.1 412 ClientAppVersion: 0.10 < 0.11
Run Code Online (Sandbox Code Playgroud)
原因短语在这里是"ClientAppVersion:0.10 <0.11".
这个例子也暗示了我想要做的事情.我正在构建类似REST的API,因此,我应该使用HTTP状态代码来指示错误.但是HTTP状态代码是针对HTTP而不是针对我的应用而发明的,所以我尝试将额外的信息填充到Reason Phrase中.
跟进以前的评论(这不是您要找的答案)。
HTTP规范(RFC 2616)声明了有关状态码和原因短语的信息:
状态码供自动机使用,原因短语供人类用户使用。不需要客户检查或显示原因短语。
从文本中可以很清楚地看出,不应期望HTTP客户端读取原因短语。实际上,如果可能的话,它通常是一个本地化的版本(不一定是服务器发送的版本)。
拥有HTTP等标准和规范的目的是希望能够实现不同的兼容实现(例如您的服务器和iOS库)以实现互操作。如果您弯腰规格,应该会遇到问题。特别是,如果您要使用的库没有为您提供原因短语的访问权限,请不要感到惊讶。
我不太确定如何解释您的评论(“我正在弯曲HTTP以使其符合REST的想法。”)我可以向您保证,可以使用HTTP来实现REST,而无需进行这种弯曲。我不确定您从何而来弯曲HTTP以适合REST想法...
如果要实现某种方式以REST方式为错误提供原因,则应在响应消息正文中(甚至可能在自定义标头中)给出原因,而不是在原因短语中给出原因。即使是纯文本响应,也比原因短语要好。例如:
代替:
HTTP/1.1 412 ClientAppVersion: 0.10 < 0.11
Run Code Online (Sandbox Code Playgroud)
使用:
HTTP/1.1 412 Precondition Failed
Content-Type: text/plain
ClientAppVersion: 0.10 < 0.11
Run Code Online (Sandbox Code Playgroud)
也许:
HTTP/1.1 412 Precondition Failed
Content-Type: text/plain
X-My-Error: ClientAppVersion: 0.10 < 0.11
Run Code Online (Sandbox Code Playgroud)
请注意,无论如何,您都应该返回一个消息正文(除非204)。状态代码412也与基于标头(您可能正在使用)的前提条件非常相关:
在服务器上测试时,在一个或多个请求标头字段中给出的前提条件被评估为false。此响应代码允许客户端在当前资源元信息(标头字段数据)上放置先决条件,从而防止所请求的方法应用于除预期资源之外的其他资源。
| 归档时间: |
|
| 查看次数: |
2536 次 |
| 最近记录: |