如何在iOS中以url的forms发布数据?

我想发送我的UITextfields数据到服务器。

我想发布数据,但服务器显示错误消息给我。

请检查我的代码:

... NSURL *url=[NSURL URLWithString:@"http://projectsatseoxperts.net.au/fishing/api/postRegister.php"]; NSString *post =[[NSString alloc] initWithFormat:@"FirstName=%@&LastName=%@userName=%@&Email=%@Phone=%@&Address=%@Password=%@&ConfirmPassword=%@", txt_firstname.text,txt_lastname.text,txt_username.text,txt_email.text,txt_phone.text,txt_address.text,txt_password.text,txt_confirmpassword.text]; NSLog(@"Post is: %@",post); NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSLog(@"postData is: %@",postData); NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSLog(@"postLength is: %@",postLength); NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; //[request setValue:@"http://projectsatseoxperts.net.au/fishing/api/postRegister.php" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSLog(@"request is: %@", [request allHTTPHeaderFields]); NSError *error; NSURLResponse *response; NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSLog(@"urlData is: %@",urlData); NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; NSLog(@"%@",data); } 

发布后的细节价值将来到这里 – http://projectsatseoxperts.net.au/fishing/api/register.php

任何想法或build议将非常受欢迎。

您的请求是正确的..只是检查您的发布数据的内容types和编码..也请咨询服务器团队,以确切的数据格式,他们期望从你..

几点意见:

  1. 你的方式你的问题,你似乎是build议你正在尝试创build一个application/x-www-form-urlencoded请求。 如果是这样,您应该相应地指定您的Content-Type

     [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
  2. 如果执行application/x-www-form-urlencoded请求,那么您必须使用CFURLCreateStringByAddingPercentEscapes (注意,不是stringByAddingPercentEscapesUsingEncoding )转义您发布的数据。 如果任何字段包含任何保留字符,则查询将失败。

     - (NSString *)percentEscapeURLParameter:(NSString *)string { return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, (CFStringRef)@":/?@!$&'()*+,;=", kCFStringEncodingUTF8)); } 
  3. 此外,您的poststring缺less一些&符号。 我可以通过使用字典来解决这个问题:

     NSDictionary *dictionary = @{@"FirstName" : txt_firstname.text, @"LastName" : txt_lastname.text, @"userName" : txt_username.text, @"Email" : txt_email.text, @"Phone" : txt_phone.text, @"Address" : txt_address.text, @"Password" : txt_password.text, @"ConfirmPassword" : txt_confirmpassword.text}; 

    然后构buildpostvariables,为每个值调用percentEscapeURLParameter ,如下所示:

     NSMutableArray *postArray = [NSMutableArray array]; [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) { [postArray addObject:[NSString stringWithFormat:@"%@=%@", key, [self percentEscapeURLParameter:obj]]]; }]; NSString *post = [postArray componentsJoinedByString:@"&"]; 
  4. 顺便说一下,这些字段名称是可疑的(在“userName”中使用小写字母“u”;通常它们都是小写字段名称)。 你确定这些字段名称吗?

除此之外,你必须告诉我们你得到的错误。

你的“后”string格式看起来不正确。 您在某些字段之间(即“LastName”和“userName”之间缺less一些“&”)。 检查您的string,因为服务器可能无法识别string中的值。 除非有特定的原因。

我怀疑,因为API正在返回XML,所以期待HTTP POST中的XML。 联系API开发人员,了解API支持的数据格式和期望的模式。

你的代码有很多问题:

  1. 可能不正确的字符编码:

    在你的代码中:

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

    您允许从原始string的字符编码到用于发布数据的字符编码的有损转换。 当它们包含非ASCII字符时,这将导致不正确的参数。

  2. 没有内容types标题集

    由于您没有设置内容types,因此您的数据将被服务器视为ASCII字符的非结构化文本,例如Content-type: text/plain; charset=us-ascii Content-type: text/plain; charset=us-ascii

    你可能想要使用application/x-www-form-urlencoded ,或者更好的application/json – 如果服务器接受这个MIMEtypes的话。

  3. 设置Content-Type时,还需要确保您的参数根据您设置的Content-Type正确编码。

为了解决这些问题,我build议尝试application/json作为Content-Type,并将您的参数编码为JSON。 使用Content-type: application/x-www-form-urlencoded也是可能的,但是这需要更详细的编码algorithm。 试试JSON:

所以,而不是有这个丑陋的string

 NSString *post =[[NSString alloc] initWithFormat:@"FirstName=%@&LastName=%@userName=%@&Email=%@Phone=%@&Address=%@Password=%@&ConfirmPassword=%@", txt_firstname.text,txt_lastname.text,txt_username.text,txt_email.text,txt_phone.text,txt_address.text,txt_password.text,txt_confirmpassword.text]; 

创build一个相应的NSDictionary对象。 然后使用NSJSONSerialization将其序列化为包含JSON的NSData对象。 使用这个数据对象为你的身体,并设置Content-Type: application/json