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 请求?