通过iOS发送POST请求

时间:2013-12-29 14:35:14

标签: ios post nsurlconnection nsurlrequest

所以我设置了一个POST请求,发送有关用户姓名,电子邮件和密码以及图像的信息。发送请求的页面已编码为var_dump($_FILES)var_dump($_POST),并返回并记录此信息。但是,var_dump()表示尚未收到文件或任何POST数据。我假设的错误必须与POST请求的编码方式有关,但是我看不出错误是什么:

    NSString *name = self.step1view.name.text;
    NSString *email = self.step2view.email.text;
    NSString *password = self.step3view.password2.text;
    NSLog([NSString stringWithFormat:@"name: %@; email: %@; password: %@",name,email,password]);
    //create URL
    NSURL *postURL = [NSURL URLWithString:URL];

    //Create post request connection
    NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:postURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60.0];

    [postRequest setHTTPMethod:@"POST"];
    NSString *stringBoundary = @"ghkyre–nhjfhdj-74f5f-gfg5-gggff";

    NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];

    [postRequest addValue:headerBoundary forHTTPHeaderField:@"Content-Type"];

    NSMutableData *postBody = [NSMutableData data];

    //USERNAME
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Disposition: form-data; name=\"name\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"%@",name] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //EMAIL
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Disposition: form-data; name=\"email\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"%@",email] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //PASSWORD
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Disposition: form-data; name=\"password\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"%@",password] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    //IMAGE
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"image.jpg\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:imageData];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [postRequest setHTTPBody:postBody];

    //send request
    NSData *responseData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"response: %@",returnString);

1 个答案:

答案 0 :(得分:0)

三件事:

  1. 设置Content-Type标头时,请使用setValue:forHTTPHeaderField而不是addValue:forHTTPHeaderField

  2. 图像参数有多余的CRLF:

    此:

    [postBody appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"image.jpg\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    

    应该是

    [postBody appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"image.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    
  3. 对于nilsendSynchronousRequest:returningResponse:error参数,请勿将response传递给error。这两个都将在请求完成后保存重要的调试信息。

  4. 更新:您的边界ghkyre–nhjfhdj-74f5f-gfg5-gggff包含Unicode字符。将其替换为-,您可以通过PHP访问POST数据。

相关问题