【问题标题】:How to post data in the form of url in iOS?如何在 iOS 中以 url 的形式发布数据?
【发布时间】:2013-12-05 11:00:17
【问题描述】:

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

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

【问题讨论】:

  • 你从服务器得到什么错误?
  • "错误" , NSLog(@"%@",data);
  • 我发布的数据对吗?有什么我没见过的东西吗?
  • 看起来不错。我们需要了解您实际收到了哪些错误消息才能为您提供帮助。
  • 我建议您联系 API 开发人员并告知他们返回状态代码 200 和“错误”正文既无效而且无益,他们应该考虑提供更详细的错误消息和适当的 HTTP 状态代码。

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


【解决方案1】:

几个观察:

  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”;通常它们都是小写的字段名称)。您确定这些字段名称吗?

除此之外,您还必须向我们展示您遇到的错误。

【讨论】:

  • Sir void 不返回任何值,那么这个方法如何返回值呢? - (void)percentEscapeURLParameter:(NSString *)string
  • @AfreenKhan 哈哈。完全正确。修改后的答案。顺便说一句,不要忘记设置Content-Type。而且您在 post 字符串中缺少与符号。并且字段名称的大小写看起来很可疑。
【解决方案2】:

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

【讨论】:

  • 好收获!不幸的是,这不是唯一的问题;)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我怀疑由于 API 返回 XML,它在 HTTP POST 中期待 XML。联系 API 开发人员以了解 API 支持的数据格式及其期望的模式。

    【讨论】:

      【解决方案5】:

      您的代码存在许多问题:

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

        在您的代码中:

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

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

      2. 没有设置 Content-Type 标头

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

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

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

      为了解决这些问题,我建议尝试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 对象。然后使用NSJSONSerialization 将其序列化为包含 JSON 的NSData 对象。将此数据对象用于您的身体,并设置Content-Type: application/json

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 2013-07-04
        • 1970-01-01
        • 2015-03-23
        • 2017-01-09
        • 2013-08-14
        • 1970-01-01
        相关资源
        最近更新 更多