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

时间:2013-12-05 11:00:18

标签: ios iphone objective-c post http-post

我想将我的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

非常欢迎任何想法或建议。

5 个答案:

答案 0 :(得分:4)

有几点意见:

  1. 您表达问题的方式似乎表明您正在尝试创建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. 此外,您的post字符串缺少一些&符号。我可以通过使用字典来解决这个问题:

    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};
    

    然后构建post变量,为每个值调用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”;通常它们都是小写字段名称)。你确定这些字段名称吗?

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

答案 1 :(得分:2)

您的“帖子”字符串格式看起来不正确。你错过了一些“&”在某些字段之间,即“LastName”和“userName”之间。检查字符串,因为服务器可能无法识别字符串中的值。除非有特定原因。

答案 2 :(得分:0)

您的请求是正确的..只需检查您的帖子数据的内容类型和编码。还要咨询服务器团队以获取他们期望的确切数据格式..

答案 3 :(得分:0)

我怀疑由于API正在返回XML,因此需要在HTTP POST中使用XML。请与API开发人员联系,以了解API支持的数据格式以及预期的架构。

答案 4 :(得分:0)

您的代码存在许多问题:

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

    在您的代码中:

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

    您允许从原始字符串的字符编码到用于发布数据的字符编码的有损转换。如果参数包含非ASCII字符,则会导致参数错误。

  2. 没有Content-Type标头集

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

    如果服务器接受该MIME类型,您可能希望使用application/x-www-form-urlencoded或更好application/json

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

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

    所以,而不是有这个丑陋的字符串

    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];
    

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