Преобразование NSMutableURLRequest в ASIFormDataRequest
Я написал стипендиальный код:
NSString *urlString = [NSString stringWithFormat:ADDRESS,action];
postStr = @"user_name=Thomas Tan&phone=01234567891&password=123456";
NSData *myRequestData = [NSData dataWithBytes:[postStr UTF8String] length:[postStr length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody: myRequestData];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSLog(@"%@",responseString);
это работает хорошо, но теперь я хочу использовать платформу asihttprequest, так что, как изменить приведенный выше код, я написал код, но он не может получить правильный результат и просто получить ошибку сервера infomation.so, в чем проблема?
NSString *urlString = [NSString stringWithFormat:ADDRESS,action];
NSURL *url = [NSURL URLWithString:urlString];
ASIFormDataRequest *requeset = [ASIFormDataRequest requestWithURL:url];
[requeset setRequestMethod:@"POST"];
[requeset setPostValue:@"Thomas Tan" forKey:@"user_name"];
[requeset setPostValue:@"01234567891" forKey:@"phone"];
[requeset setPostValue:@"123456" forKey:@"password"];
[requeset startSynchronous];
NSError *error = [requeset error];
if (!error) {
NSString *re = [requeset responseString];
NSLog(@"%@",re);
}
NSLog(@"%@",error);
заранее спасибо.
ОБНОВИТЬ:
NSString *urlString = [NSString stringWithFormat:ADDRESS,action];
NSURL *url = [NSURL URLWithString:urlString];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request appendPostData:[@"user_name=Thomas Tan&phone=01234567891&password=123456" dataUsingEncoding:NSUTF8StringEncoding]];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *re = [request responseString];
NSLog(@"%@",re);
}
NSLog(@"%@",error);
Я использую приведенный выше код, он также не может получить тот же результат, и ошибка не ноль.
1 ответ
Ваш код ASIHTTP не делает то же самое, что ваш код NSURLConnection. ASIFormDataRequest автоматически:
- установите заголовок Content-Type в
application/x-www-form-urlencoded
- URL-кодированные ваши параметры
Обычно это именно то, что вам нужно, но если вы получаете правильное поведение с кодом NSURLConnection и неправильное с ASIHTTP, то вам нужно перейти на пользовательский ASIHTTP POST и использовать ASIHTTPRequest, а не ASIHTTPFormDataRequest, а затем вручную установить тип Conten вернуться к application/x-www-form-urlencoded
:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded"];
[request appendPostData:[@"user_name=Thomas Tan&phone=01234567891&password=123456" dataUsingEncoding:NSUTF8StringEncoding]];
Делая это, и проверяя, что именно было отправлено на сервер с помощью Wireshark, я вижу, что отправленные данные POST все еще не совсем идентичны (ASIHTTP слева, NSURLConnection справа):
Но тип контента, длина и фактические данные идентичны. На этом этапе я ожидаю, что ваш сервер вернет тот же результат. Если этого не произойдет, вы можете отредактировать параметры запроса ASIhTTP для соответствия.