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

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

【问题讨论】:

    标签: objective-c ios afnetworking


    【解决方案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 170line 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]];
    • 非常感谢。你拯救了我的一天!
    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 2014-04-27
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2016-03-28
    相关资源
    最近更新 更多