无法使用 AFNetworking 发出 POST 请求
Posted
技术标签:
【中文标题】无法使用 AFNetworking 发出 POST 请求【英文标题】:Cannot make POST Request with AFNetworking 【发布时间】:2017-01-11 21:31:39 【问题描述】:******************已编辑************************
我对 ios 比较陌生,我想使用以下代码进行发布请求:
我收到 NSLocalizedDescription=请求失败:不可接受的内容类型:text/html,NSErrorFailingURLKey=https://xxxxxx-xxxxxx/xxxx/xxxx,com.alamofire.serialization.response.error.response= URL:https://xxxxxx/xxx/xxxx/xxxxxs
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];
[requestSerializer setValue:token1 forHTTPHeaderField:@"Authorization"];
[requestSerializer setValue:@"PP" forHTTPHeaderField:@"x-service-code"];
[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager setRequestSerializer:requestSerializer];
NSDictionary *params = [[NSDictionary alloc] initWithObjectsAndKeys:
token.tokenId, @"payment_method_nonce",
details.city, @"city",
details.address1, @"address1",
details.state, @"state",
details.zipcode, @"zip",
nil];
[manager POST:url parameters:params
success:^(NSURLSessionDataTask *task, id responseObject)
NSLog(@"SUCCEEDED");
failure:^(NSURLSessionDataTask *task, NSError *error)
loadingOverlay.hidden = YES;
NSLog(@"FAILED %@",error);
];
我发现了问题所在:我需要将参数作为原始 JSON 发送,但它没有这样做。我如何做到这一点?
我希望参数采用原始格式,即
"payment_method_nonce":"tok_xxxxxxxx"
【问题讨论】:
unacceptable content-type: text/html
。尝试将text\html
添加到接受的内容类型。
不起作用 + 我们的服务器不接受该格式。我已经验证问题不是标题而是参数正文。它需要作为原始 json 发送。如何将参数转换为原始 JSON?
如何使用 JSON 格式的正文发送包含地址和令牌以及其他详细信息的发布请求?
由于您将requestSerializer
设置为AFJSONRequestSerializer
,它本身应该将参数转换为JSON 并将它们放入正文中。简单来说就是:NSDictionary ---(NSJSONSerialization)--> NSData (JSON 表示) --> theNS(Mutable)Request.htttpBody = theJSONNSData.
我不知道是什么问题。我可以尝试使用构造 WithBodyBlocks 吗?
【参考方案1】:
解决了,我改用 NSMutableDictionary:
[paymentDetails setObject:token.tokenId forKey:@"payment_method_nonce"];
[paymentDetails setObject:details.address1 forKey:@"address1"];
[paymentDetails setObject:details.city forKey:@"city"];
[paymentDetails setObject:details.state forKey:@"state"];
[paymentDetails setObject:details.zipcode forKey:@"zip"];
并使用 AFHTTPRequestOperationManager 而不是 AFHTTPSessionManager
【讨论】:
似乎AFHTTPRequestOperationManager
是解决方案;不是NSMutableDictionary
。 NSMutableDictionary
和 NSDictionary
应为请求生成相同的 params
。以上是关于无法使用 AFNetworking 发出 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking - 如何通过 ID 发出 POST 请求
如何在 AFNetworking 的帮助下发出 Twilio api Post 请求?
AFNetworking 通过 HTTPS 发出 post 请求