AFNetworking 2.0使用URL参数发送发布请求

时间:2013-12-27 04:05:43

标签: ios objective-c afnetworking-2

如何使用POST 2.0发送AFNetworking请求以及网址中的所有参数,如下所示:

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)

6 个答案:

答案 0 :(得分:21)

之前的最佳答案是让后端更改并接受正文中的参数。这是首选的方法,但有时我们中的一些人会使用无法改变的后端,所以我提供了这个解决方案......

在AFURLRequestSerialization类中有一个名为HTTPMethodsEncodingParametersInURI的属性,它是一个NSSet,它包含允许在uri GETHEADDELETE中使用params的http方法默认情况下。

您可以覆盖它并包含POST。

在AFURLRequestSerialization.m中的

行462有一个if语句,用于检查self.HTTPMethodsEncodingParametersInURI属性是否包含POST。如果它没有(因为它没有默认),它会将参数放在正文中。

您可以注释掉该id语句以进行快速测试。

为了让它工作,我建议覆盖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中发送参数。为我工作,希望它能帮助别人

答案 1 :(得分:3)

#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];
    }];

试试这个

答案 2 :(得分:1)

我和你有同样的问题。

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

错误原因是:

当您使用http:www.baidu.com/api?id = 1& name =我等参数初始化NSUrl时,它需要您使用utf-8对urlString进行编码

如:

//解决奇葩需求:?请求方式为交时,URL带ID = 1之类主要原因是URL带中文的时候URL初始化失败     URLString = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

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

希望能帮到你!

答案 3 :(得分:0)

你可以尝试一下。

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];

答案 4 :(得分:0)

我能够通过创建这样的字符串来实现这一点:

  

NSString * relativeURL = [NSString   stringWithFormat:@ “?/回报/提交deviceUUID =%@&安培; rewardID =%@”,[[客户端   sharedInstance] deviceUUID],self.rewardID];

然后将其作为查询传递。我必须按如下方式设置requestSerializer和responseSerializer:

  

client.requestSerializer = [AFJSONRequestSerializer序列化程序];
  client.responseSerializer = [AFHTTPResponseSerializer序列化程序];

答案 5 :(得分:0)

一旦我离开manager.requestSerializer属性并让它成为默认属性(AFHTTPRequestSerializer),我就为我工作了。 我正在POST的服务,似乎期待UTF8编码的身体参数。