无法使用 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 是解决方案;不是NSMutableDictionaryNSMutableDictionaryNSDictionary 应为请求生成相同的 params

以上是关于无法使用 AFNetworking 发出 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking - 如何通过 ID 发出 POST 请求

如何在 AFNetworking 的帮助下发出 Twilio api Post 请求?

AFNetworking 通过 HTTPS 发出 post 请求

AFNetworking Post 请求不起作用

无法使用 AFNetworking Objective-C 获取 XML 响应的内部节点

如何在 iOS 中发出 POST 请求?