AFNetworking 2.0:是不是可以将纯 json 放入 POST 请求的正文中?

Posted

技术标签:

【中文标题】AFNetworking 2.0:是不是可以将纯 json 放入 POST 请求的正文中?【英文标题】:AFNetworking 2.0: is it possible to put pure json in the body of a POST request?AFNetworking 2.0:是否可以将纯 json 放入 POST 请求的正文中? 【发布时间】:2014-03-18 14:57:33 【问题描述】:

我想从我的应用发出以下请求:

AFHTTPRequestOperationManager *requestManager = [[AFHTTPRequestOperationManager alloc] init];
requestManager.responseSerializer.acceptableContentTypes = [requestManager.responseSerializer.acceptableContentTypes setByAddingObject:@"application/json"];
requestManager.requestSerializer = [AFJSONRequestSerializer serializer];
[requestManager POST:urlString parameters:aParameters constructingBodyWithBlock:nil success:^(AFHTTPRequestOperation *operation, id responseObject)

    NSLog(@"%@", responseObject);

failure:^(AFHTTPRequestOperation *operation, NSError *error)

    NSLog(@"error: %@", error);
];

其中aParameters是一个NSDictionary,内容如下:

NSDictionary *urlParams = @@"username" : anUser.userName, @"password" : anUser.password;

当我使用“anUsername”和“aPassword”的用户输入从我的应用程序发出请求时,我在我的 servlet 中获得以下正文日志:

--Boundary+5738A89B2C391231
Content-Disposition: form-data; name="password"

aPassword
--Boundary+5738A89B2C391231
Content-Disposition: form-data; name="username"

anUsername
--Boundary+5738A89B2C391231--

multipart/form-data; boundary=Boundary+5738A89B2C391231

我的印象是使用 AFJSONRequestSerializer 会以适当的格式发送我的请求,但正如日志所示,它是多部分/表单数据。 (对我来说)解析这种请求真的很难(我在服务器端用 Java 解析它),所以我的问题是:是否可以在我的请求正文中发送 json?像这样的:


    "userName" : "anUsername",
    "password" : "aPassword"

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

对于任何相关人员:您应该使用POST:parameters:success:failure:,而不是使用POST:parameters:constructingBodyWithBlock:success:failure: 方法。前者执行多部分表单请求,而后者执行 url 表单编码。此外,要以 JSON 格式发送参数,AFHTTPRequestOperationManager 实例的requestSerializer 属性应该是AFJSONRequestSerializer 的实例(默认设置为AFHTTPRequestSerializer) 详细浏览AFHTTPRequestOperationManager的实现文件真的很有帮助,它帮助我解决了这个错误。

【讨论】:

【参考方案2】:

您不需要在 POST 请求中发送纯 JSON,只需发送参数字典。这是适用于 POST 请求的示例代码。

+ (void)login:(BOUser *)user responseBlock:(APIRequestResponseBlock)responseBlock 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    [manager.requestSerializer setValue:@"parse-application-id-removed" forHTTPHeaderField:@"X-Parse-Application-Id"];
    [manager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
     manager.securityPolicy.allowInvalidCertificates = YES;

    NSString *URLString = [NSString stringWithFormat:@"%@login", BASE_URL_STRING];
    NSDictionary *params = @@"email": user.username,
                             @"password": user.password;


    [manager POST:URLString parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) 
        NSLog(@"JSON: %@", responseObject);
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        NSLog(@"Error: %@", error);
        responseBlock(nil, FALSE, error);
    ];


希望对你有帮助。

【讨论】:

这没有回答问题。

以上是关于AFNetworking 2.0:是不是可以将纯 json 放入 POST 请求的正文中?的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 是不是支持后台任务? - IOS 7

XSLT 使用 xslt 2.0 或更高版本将纯文本文件处理为 XML

如何使用 AFNetworking-2.0 执行 JSON 编码的 GET 请求?

AFNetworking 2.0 - 在监控进度的同时批量下载图像

使用 AFNetworking 2.0 签署 API 请求

AFNetworking 2.0 AFHTTPSessionManager