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
返回成功或失败答案 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用于发送内容的代理地址通过查尔斯。