我正在尝试使用与本文类似的模式,该模式描述了对RESTful API进行PUT / POST,但对GET进行。
我的原始代码看起来几乎相同,除了我使用了GET:
关键字。我很快发现,它不是发送JSON正文,而是通过url编码参数。AFJSONSerializer
该类的文档中未提及。您必须转到超类文档(AFHTTPSerializer
)并通读其属性,在其中可以找到有关HTTPMethodsEncodingParametersInURI的内容。默认情况下,该集合将填充HEAD,GET和DELETE。因此,对于这些类型的请求,JSON序列化程序显然会还原为其行为的父类?
因此,我将以下代码放在一起:
AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
manager.securityPolicy.allowInvalidCertificates = YES;
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet set];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername: currentUser() password: currentPassword()];
[manager
GET: @"https://172.16.214.214:44321/trees"
parameters: [NSDictionary dictionary]
success:^(NSURLSessionDataTask* task, id responseObject){
NSLog(@"Response: %@", responseObject);}
failure:^(NSURLSessionDataTask* task, NSError* error){
NSLog(@"Error: %@", error);}];
设置的行HTTPMethodsEncodingParametersInURI = [NSSet set]
旨在让我也可以像获取GET一样获取JSON编码的参数。不幸的是,当我使用它并在错误控制台中获得以下信息时,在服务器上什么也没看到:
2013-12-10 10:11:14.149 myValve[957:60b] Error: Error Domain=NSURLErrorDomain Code=-1005 "The
network connection was lost." UserInfo=0x17e5d4b0
{NSErrorFailingURLStringKey=https://172.16.214.214:44321/trees,
NSErrorFailingURLKey=https://172.16.214.214:44321/trees, NSLocalizedDescription=The network
connection was lost., NSUnderlyingError=0x17e53240 "The network connection was lost."}
我还缺少什么?
AFNetworking行为背后的原理可能在堆栈溢出问题HTTP HTTP GET with request body中得到最简洁的解释。这些答案之一引用了Ray Fielding的话:
...换句话说,任何HTTP请求消息都允许包含消息正文,因此必须在解析消息时牢记这一点。但是,GET的服务器语义受到限制,以使主体(如果有的话)对请求没有语义含义。解析要求与方法语义要求分开。
因此,是的,您可以使用GET发送正文,否,这样做永远没有用。
的HTTP / 1.1规范定义GET
要被包括在所述请求的主体中,以“检索的任何信息(以一个实体的形式)由Request-URI中确定的”和没有考虑的信息。因此,从GET
技术上讲,应禁止禁止使用人体,但充其量,这是非标准的。AFNetworking选择不支持它并不完全令人惊讶。
因此,您可能不想将JSON放入GET
请求的主体中。通常将参数添加到URL。如果要在请求的正文中发送JSON,请执行POST
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句