web-dev-qa-db-ja.com

POST iPhoneからSSL HTTPS経由でデータを送信する

みなさん、

私のiphoneプロジェクトでは、ユーザー名とパスワードをWebサーバーに渡す必要があります。以前はGETメソッドを使用してデータを渡し、GET形式のURLを使用していました(例:localhost:8888/login?userName = admin&password = password)。これをPOSTデータとして送信する必要があります。

誰かが私が以下のこのコードの何が間違っているかを見つけるのを助けることができますか?

私が試したコード..


NSString *post =[NSString stringWithFormat:@"userName=%@&password=%@",userName.text,password.text];

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:@"https://localhost:443/SSLLogin/login.php"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
NSLog(data);

このページは、php echoを使用して成功または失敗を返します

26
shinto Joseph

リクエストをNSASCIIStringEncodingとして送信していますが、NSUTF8StringEncodingを探しています

設定します

 NSData * postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 

そして

 [request setValue:@ "application/x-www-form-urlencoded charset = utf-8" forHTTPHeaderField:@ "Content-Type"]; 

しかし、ニコライが指摘したように、エラーが何であるかを知っていれば、これは簡単です:-)

9
Andiih

IPhoneから安全な接続を介してデータを送信する方法がようやく見つかりました。

NSString *post =[[NSString alloc] initWithFormat:@"userName=%@&password=%@",userName.text,password.text];
NSURL *url=[NSURL URLWithString:@"https://localhost:443/SSLLogin/Login.php"];

NSLog(post);
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

/* when we user https, we need to allow any HTTPS cerificates, so add the one line code,to tell teh NSURLRequest to accept any https certificate, i'm not sure about the security aspects
*/

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url Host]];

NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
NSLog(@"%@",data);

警告メッセージを回避するには、追加してください


@interface NSURLRequest (DummyInterface)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)Host;
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)Host;
@end

礼儀:

  1. フローフレンドとサポーターを介して私のすべてのスタックに
  2. http://www.cocoadev.com/index.pl?HTTPFileUpload
  3. http://blog.timac.org/?tag=nsurlrequest
28
shinto Joseph

まあ、これはまさにあなたの質問への答えではありません。しかし、別の方法として、このコードを見てください。ユーザー名とパスワードをサーバーに送信するためにこれをうまく使用しています。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:loginURL]];

//set HTTP Method
[request setHTTPMethod:@"POST"];

//Implement request_body for send request here username and password set into the body.
NSString *request_body = [NSString stringWithFormat:@"Username=%@&Password=%@",[Username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [Password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
//set request body into HTTPBody.
[request setHTTPBody:[request_body dataUsingEncoding:NSUTF8StringEncoding]];

//set request url to the NSURLConnection
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];


if(theConnection) //get the response and retain it

次に、次のデリゲートを実装して応答を確認できます

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

お役に立てれば。

8
Vaishnavi Naidu

HTTPの問題をデバッグするには、 Charles HTTPプロキシアプリを取得することをお勧めします。これにより、シミュレータを介してサーバーとの間のすべてのHTTP通信が記録されます(さらに、プロキシとして設定することもできます)必要に応じて電話)。

次に、プログラムCurl(ターミナルから、組み込み)を使用して、機能する投稿リクエストを生成します(CURLの使用例については、オンラインで検索する必要があります)。次に、単にCURLからの作業リクエストのフォーマット方法と、アプリケーションが送信するものを比較します...シミュレーターは自動的にCharles経由で動作するようにリダイレクトされます。物事を送信するために使用するプロキシアドレスをcurlに通知する必要がありますチャールズを通して。