みなさん、
私の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を使用して成功または失敗を返します
リクエストをNSASCIIStringEncodingとして送信していますが、NSUTF8StringEncodingを探しています
設定します
NSData * postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
そして
[request setValue:@ "application/x-www-form-urlencoded charset = utf-8" forHTTPHeaderField:@ "Content-Type"];
しかし、ニコライが指摘したように、エラーが何であるかを知っていれば、これは簡単です:-)
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
礼儀:
まあ、これはまさにあなたの質問への答えではありません。しかし、別の方法として、このコードを見てください。ユーザー名とパスワードをサーバーに送信するためにこれをうまく使用しています。
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
お役に立てれば。
HTTPの問題をデバッグするには、 Charles HTTPプロキシアプリを取得することをお勧めします。これにより、シミュレータを介してサーバーとの間のすべてのHTTP通信が記録されます(さらに、プロキシとして設定することもできます)必要に応じて電話)。
次に、プログラムCurl(ターミナルから、組み込み)を使用して、機能する投稿リクエストを生成します(CURLの使用例については、オンラインで検索する必要があります)。次に、単にCURLからの作業リクエストのフォーマット方法と、アプリケーションが送信するものを比較します...シミュレーターは自動的にCharles経由で動作するようにリダイレクトされます。物事を送信するために使用するプロキシアドレスをcurlに通知する必要がありますチャールズを通して。