1

私はフェローコードを書きました:

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 フレームワークを使いたいので、上記のコードをどのように変更すればよいか、コードを書いたのですが、正しい結果が得られず、サーバーのエラー情報が表示されるだけです。

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

上記のコードを使用しますが、同じ結果が得られず、エラーはゼロではありません。

4

1 に答える 1

0

あなたの ASIHTTP コードは、NSURLConnection コードと同じことをしていません。ASIFormDataRequest は自動的に次のことを行います。

通常はこれで十分ですが、NSURLConnection コードでは正しく動作し、ASIHTTP では正しく動作しない場合は、カスタム ASIHTTP POSTに変更し、 ASIHTTPFormDataRequest ではなく ASIHTTPRequest を使用してから、コンテンツ タイプを手動で設定する必要があります。戻る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 要求パラメーターを編集して一致させることができます。

于 2012-05-06T06:09:34.533 に答える