使用 AFHTTPClient 将 JSON 作为 POST 请求的主体发布

Posted

技术标签:

【中文标题】使用 AFHTTPClient 将 JSON 作为 POST 请求的主体发布【英文标题】:Posting JSON as the body of a POST request using AFHTTPClient 【发布时间】:2011-10-30 03:09:05 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我继续从他们的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 170 和line 268 的默认编码。

【讨论】:

呵呵,我没有意识到 JSON 被设置为默认编码。这是一个错误(URL 表单编码一直是我的默认设置;我不确定它是如何出现的)。 @EricAndres:请注意这一点,并手动将参数编码设置为 JSON,在您的代码中使用 self.parameterEncoding = AFJSONParameterEncoding; 太棒了,感谢您的回复。稍后有机会我会尝试设置 self.parameterEncoding。 hmm...json 不是默认编码,但 NVP 是(截至 2013 年初)【参考方案2】:

对我来说,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];

【讨论】:

非常感谢!你是对的,[client setParameterEncoding:AFJSONParameterEncoding]; 不见了。但除此之外,它似乎也需要它实际上与 NSDictionary 一起工作:[client registerHTTPOperationClass:[AFJSONRequestOperation class]]; 非常感谢。你拯救了我的一天!

以上是关于使用 AFHTTPClient 将 JSON 作为 POST 请求的主体发布的主要内容,如果未能解决你的问题,请参考以下文章

是否有 AFHTTPClient 使用 AFNetworking 发布 json 的示例?

使用 AFNetworking(AFHTTPClient 子类)将 JSON 发送到服务器 => 这是一个异步操作

AFHttpclient 在块中获取 json 主体但外部函数返回 null

AFNetworking AFHTTPClient 成功和失败的不同内容类型

如何为不同的请求方法创建具有不同参数编码的 AFHttpClient?

AFNetworking 使用 JSON 到 PHP 服务器的参数