AFNetworking 2.0 Отправка почтового запроса с параметрами URL

Как отправить запрос POST с AFNetworking 2.0 со всеми параметрами в 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)


person barndog    schedule 27.12.2013    source источник
comment
удачи в решении этого?   -  person bpn    schedule 18.02.2014
comment
Нет, я просто попросил своих бэкэнд-парней делать все почтовые запросы в теле. Это то, что рекомендует @mattt.   -  person barndog    schedule 18.02.2014
comment
Вы можете просто отформатировать URL-адрес самостоятельно, чтобы включить кодировку параметров, прежде чем отправлять его менеджеру для POST. Это то, что я в итоге сделал. Остерегайтесь, однако, что вам действительно нужно правильно обрабатывать кодировку, если это так (если вы не делаете что-то простое, например, отправляете число или около того).   -  person BjornW    schedule 21.01.2019


Ответы (6)


Предыдущий лучший ответ заключался в том, чтобы изменить бэкэнд и принять параметры в теле. Это предпочтительный метод, но иногда некоторые из нас застревают, используя бэкенды, которые нельзя изменить, поэтому я предлагаю это решение....

В классе AFURLRequestSerialization есть свойство с именем HTTPMethodsEncodingParametersInURI, которое представляет собой NSSet, содержащий методы http, которым разрешено использовать параметры в uri GET, HEAD и DELETE по умолчанию.

Вы можете переопределить это и включить POST.

в строках 462 AFURLRequestSerialization.m есть оператор 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....]];

это должно позволить отправлять параметры в uri POST. сработало для меня, надеюсь, это поможет кому-то еще

person bolnad    schedule 14.05.2014
comment
Я только что добавил POST в HTTPMethodsEncodingParametersInURI, и это сработало, большое спасибо. - person AmJa; 23.10.2014

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

попробуй это

person waki    schedule 27.12.2013
comment
Нах это то же самое. При этом параметры помещаются в тело, а не в URI. Спасибо, хотя, это была верная попытка. Я думаю, что я просто попрошу своего бэкэнда изменить все параметры тела. - person barndog; 27.12.2013
comment
Нет, это не то же самое. При использовании в URL в php вы получили $_GET, для $_POST нужно отправить в теле. - person waki; 27.12.2013

У меня была такая же проблема с вами.

Ответы других людей кажутся точными.

Причина ошибки:

когда вы запускаете NSUrl с такими параметрами, как http:www.baidu.com/api?id=1&name=我, вам нужно кодировать вашу urlString с помощью utf-8

такие как :

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

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

Надеюсь помочь вам!

person Ellin    schedule 22.09.2015

можешь попробовать это.

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];
person Nassif    schedule 27.12.2013

Я смог сделать это, создав строку следующим образом:

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

а затем передать его как запрос. Мне пришлось установить requestSerializer и responseSerializer следующим образом:

client.requestSerializer = [сериализатор AFJSONRequestSerializer];
client.responseSerializer = [сериализатор AFHTTPResponseSerializer];

person bpn    schedule 19.02.2014

У меня сработало, как только я оставил свойство manager.requestSerializer в покое и оставил его по умолчанию (AFHTTPRequestSerializer). Служба, в которую я отправлял POST, по-видимому, ожидала параметров тела в кодировке UTF8.

person Shyam Bhat    schedule 20.02.2014