通过SSL HTTPS从iphone发送POST数据

时间:2009-10-15 09:47:12

标签: iphone-sdk-3.0 iphone

Hai all,

在我的iphone项目中,我需要将用户名和密码传递给Web服务器,之前我使用GET方法传递数据并使用带有GET格式的URL(例如:localhost:8888 / login?userName = admin& 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

返回成功或失败

3 个答案:

答案 0 :(得分:9)

您正在以NSASCIIStringEncoding发送请求,但正在寻找NSUTF8StringEncoding

我要设置

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

[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
然而,正如尼古拉指出的那样 - 如果我们知道错误是什么,这会更容易: - )

答案 1 :(得分:8)

嗯,这完全不是你问题的答案。但作为替代方案,请看一下这段代码。我成功地使用它来向服务器发送用户名和密码。

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

希望这有帮助。

答案 2 :(得分:0)

要调试HTTP问题,最好的办法是获取Charles HTTP代理应用程序 - 它将通过模拟器记录与服务器之间的所有HTTP通信(您甚至可以将其设置为代理服务器)如果你需要手机)。

然后,使用程序Curl(来自Terminal,它内置)生成一个工作发布请求(您必须在线搜索使用CURL的示例)。然后,您只需比较CURL的工作请求的格式,以及您的应用程序发送的内容...请注意,模拟器会自动重定向以通过Charles工作,您必须告诉curl用于发送内容的代理地址通过查尔斯。