2011-10-30 92 views
16

我想找到一种方法,使用AFNetworking,将Content-Type头设置为application/json,并在主体中使用JSON进行POST。我在文档中看到的方法(postPath和requestWithMethod)都采用参数字典,我假设这些参数是以标准格式语法编码的。有谁知道一种方法来指导AFHTTPClient为身体使用JSON,还是我需要自己写请求?使用AFHTTPClient发布JSON作为POST请求的主体

回答

23

我继续从他们的master branch检查出最新的AFNetworking。开箱即用,我能够获得理想的行为。我看起来像是最近的变化(10月6日),所以你可能只需要拉最新的。

我写了下面的代码,以使一个请求:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 
[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

在我代理,我可以看到原始的请求:

POST /hello123 HTTP/1.1 
Host: localhost:8080 
Accept-Language: en, fr, de, ja, nl, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8 
User-Agent: info.evanlong.apps.TestSample/1.0 (unknown, iPhone OS 4.3.2, iPhone Simulator, Scale/1.000000) 
Accept-Encoding: gzip 
Content-Type: application/json; charset=utf-8 
Accept: */* 
Content-Length: 21 
Connection: keep-alive 

{"k2":"v2","k1":"v1"} 

从AFHTTPClient源,你可以看到JSON编码是默认根据line 170line 268

+11

咦,我没有意识到JSON设定为默认编码。这是一个错误(URL表单编码一直是我的默认打算;我不知道这是如何滑入)。 @EricAndres:请注意这一点,并手动将参数编码设置为JSON,在您的代码中使用'self.parameterEncoding = AFJSONParameterEncoding;'。 – mattt

+0

太棒了,谢谢你的回复。稍后当我有机会时,我会尝试设置self.parameterEncoding。 –

+0

hmm ... json不是默认编码,但NVP是(截至2013年初) – stackOverFlew

13

对我来说,json不是默认编码。您可以手动设置为默认的编码是这样的:

(使用Evan的代码)

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/"]]; 

[client setParameterEncoding:AFJSONParameterEncoding]; 

[client postPath:@"hello123" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil] 
     success:^(id object) { 
      NSLog(@"%@", object); 
     } failure:^(NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"%@", error); 
     }]; 
[client release]; 

关键部分:

[client setParameterEncoding:AFJSONParameterEncoding]; 
+1

非常感谢! 你说得对,'[客户端setParameterEncoding:AFJSONParameterEncoding];'丢失。 但此外似乎这也是实际使用NSDictionary所需的:'[client registerHTTPOperationClass:[AFJSONRequestOperation class]];' – thedp

+0

非常感谢。你拯救我的一天! – kb920