AFNetworking 2.0发送带有URL参数的邮件请求

我如何发送带有AFNetworking 2.0的POST请求,其URL中的所有参数如下所示:

http://www.myserver.com?api_key=something&lat=2.4&radius=100

现在我有:

 NSString* query = @"http://example.com?name=param&date=param"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSDictionary *parameters = @{}; [manager POST:query parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

但它不工作,我得到这个错误:

Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: bad request (400)

以前的最佳答案是让后端更改并接受正文中的参数。 多数民众赞成在首选的方法,但有时我们中的一些卡住后端,不能改变,所以我提供这种解决scheme….

在AFURLRequestSerialization类中,有一个名为HTTPMethodsEncodingParametersInURI的属性,它是一个NSSet,它包含允许在URI, HEADDELETE默认使用参数的http方法。

你可以覆盖它,并包括POST。

在AFURLRequestSerialization.m行462中有一个if语句来检查self.HTTPMethodsEncodingParametersInURI属性是否包含POST。 如果没有(因为它没有默认),它会把参数放在主体中。

你可以注释掉这个id语句来进行快速testing。

为了让它起作用,我推荐覆盖HTTPMethodsEncodingParametersInURI属性。

当设置您的AFHTTPSessionManager它应该看起来像这样…

  AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:self.httpBaseUrl]]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet setWithArray:@[@"POST", @"GET", @"HEAD", whatever other http methods you need here....]]; 

这应该允许在POST的uri中发送参数。 为我工作,希望它可以帮助别人

 #import "AFNetworking.h" ... [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSDictionary *params = @{@"param1": value1, @"param2": value}; manager.responseSerializer = [AFJSONResponseSerializer serializer]; // if response JSON format [manager POST:@"http://domain.com/backend.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; }]; 

尝试这个

我和你有同样的问题

其他人的答案似乎是准确的。

错误的原因是:

当你用参数如http:www.baidu.com/api?id = 1&name =我初始化NSUrl时,它需要你用utf-8编码你的urlString

如 :

//解决奇葩需求:请求方式为post时,url带?id = 1之类。主要原因是url带中文的时候url初始化失败。

 NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; 

希望能帮到你!

你可以试试这个吗?

 NSString* apiURL = @"http://example.com" AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:apiURL]]; manager.responseSerializer = [AFJSONResponseSerializer serilizer]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; NSDictionary *parameters = @{@"name":@"John",@"date":"27/12/2013"}; AFHTTPRequestOperation *apiRequest = [manager POST:@"" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog@"response ---%@,responseObject"; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; [apiRequest start]; 

我能够通过创build像这样的string来做到这一点:

NSString * relativeURL = [NSString stringWithFormat:@“/ reward / commit?deviceUUID =%@&rewardID =%@”,[[Client sharedInstance] deviceUUID],self.rewardID];

然后传递它作为查询。 我必须如下设置requestSerializer和responseSerializer:

client.requestSerializer = [AFJSONRequestSerializer serializer];
client.responseSerializer = [AFHTTPResponseSerializer serializer];

一旦我离开了manager.requestSerializer属性,让它成为默认值(AFHTTPRequestSerializer),为我工作。 我正在发布的服务看起来像UTF8编码的身体参数。