发布请求不起作用,但在浏览器中工作正常?

时间:2013-10-17 12:31:27

标签: ios json http-post

这是我的代码,它使用POST请求来检索数据,但我无法获得所需的结果。 url没有问题,因为它在浏览器上显示JSON输出。

NSString *urlString = @"my url string";                      
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];          
[request setURL:[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];       
[request setHTTPMethod:@"POST"];

NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"email_string\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n",allIOSContactsEmailAddresses] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if (data!=nil)
    {
        NSArray* array=[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        NSLog(@"array=%@",array);
    }        
}];

它在控制台中显示array =(null)。

2 个答案:

答案 0 :(得分:1)

我只是尝试使用您的代码,并且成功没有任何问题。

因此,您的问题出在您发送请求的服务器中,或者在NSURLConnection委托方法中,这些方法未正确实现。

您还应发布发送代码(NSURLConnection用法)。

答案 1 :(得分:1)

您的多部分邮件正文未正确设置。

在最后一部分(你只有一部分)之后,需要一个“close-boundary-delimiter”。因此,在为请求设置正文之前,需要附加分隔符:

 [body appendData:[[NSString stringWithFormat:@"\r\n--%@--", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

严格来说,没有必要用CRLF(“\ r \ n”)关闭“close-boundary-delimiter”。

不需要在CRLF(您没有)之前添加实际正文值( allIOSContactsEmailAddresses )。该CRLF将被视为正文内容。实际上,这可能会使消费者感到困惑。

相反,对于文本正文,有时需要关闭 CRLF (取决于服务器)。

注意添加标题时,必须使用CRLF关闭它(就像您一样)。为了关闭标题区域,需要关闭CRLF。对此,您的信息是正确的。