使用 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 成功和失败的不同内容类型