【问题标题】:NSURLRequest results in 500 errorNSURLRequest 导致 500 错误
【发布时间】:2014-04-01 17:32:37
【问题描述】:

我正在尝试使用 NSURL 请求进行 api 调用以上传图像,但我继续收到 500 错误。为了向您展示我在这里尝试完成的是 curl 命令的样子。

$ curl -i -F api_password=<YOUR_API_PASSWORD> -F file=@<LOCAL_FILE_PATH> https://upload.api.com/

这是我到目前为止的内容,并且我继续收到 500 个错误。你们能告诉我我做错了什么吗(我不是 NSURLRequest 大师)。

NSString *apiPass = @"apiKey";
NSString *filePath = imagePath;

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"https://upload.wistia.com"]];
[request setHTTPMethod:@"POST"];

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;"];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

// Create data string
NSString *dataString = [NSString stringWithFormat:@"api_password=%@&file=@%@", apiPass, filePath];

NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

[request setHTTPBody:[dataString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLResponse * response = nil;
NSError * error = nil;

[NSURLConnection sendSynchronousRequest:request
                      returningResponse:&response
                                  error:&error];

【问题讨论】:

    标签: ios xcode cocoa-touch nsurlrequest


    【解决方案1】:

    尝试编写类似这样的 POST 请求:

    NSString *boundary = @"---###-----##----##--#----###---BOUNDARY---###";
    NSMutableData *postBody = [NSMutableData data];
    NSString *postString = nil;
    
    postString = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary];
    postString = [postString stringByAppendingString:@"Content-Disposition: form-data; name=\"api_password\"\r\n\r\n"];
    postString = [postString stringByAppendingString:apiPass];
    
    postString = [postString stringByAppendingString:[NSString stringWithFormat:@"\r\n--%@\r\n", boundary]];
    postString = [postString stringByAppendingString:@"Content-Disposition: form-data; name=\"file\"\r\n\r\n"];
    postString = [postString stringByAppendingString:filePath];
    
    postString = [postString stringByAppendingString:[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary]];
    
    [postBody appendData:[postString dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://upload.wistia.com"] 
                                                           cachePolicy:NSURLRequestReturnCacheDataElseLoad
                                                       timeoutInterval:60.0f];
    [request setHTTPMethod:@"POST"];    
    
    [request setValue:@"*/*" forHTTPHeaderField:@"Accept"];   
    [request setValue:[@"multipart/form-data; boundary=" stringByAppendingString:boundary] forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d", postBody.length] forHTTPHeaderField:@"Content-Length"];
    
    [request setHTTPBody:postBody];
    

    【讨论】:

    • 看起来不错。但是,可以通过展示如何将图像数据放入一个多部分来改进它。最好附加NSData 对象,而不是附加NSStrings,然后最后将字符串转换为NSData 对象。
    • 如我所见,在初始代码示例文件中只是文件路径。这看起来很奇怪,但一切皆有可能。我认为,在实际情况下,需要使用 NSData dataWithhContentsOfURL 或 NSData dataWithContentsOfFile 将文件准备为要上传的数据。正如您在上面描述的那样,准备好的 NSData 可以放在 POST-request 的主体中。
    • 感谢您对此的看法。我仍然收到 500 错误。我正在就错误与 Wistia 联系,因此我会在找到解决方案后发布。
    • 根据wistia.com/doc/upload-api,您必须上传编码文件 - 而不是文件链接:“要从您的计算机上传文件,请提供所需的参数并将您的媒体文件作为多部分发布到upload.wistia.com - 形成编码数据。”例如,请参阅我的下一个答案。
    【解决方案2】:

    当我想将“photo.jpg”上传到某个服务器时,我使用如下代码:

    UIImage *image = [UIImage imageNamed:@"photo.jpg"];
    
    NSData *imageData = UIImageJPEGRepresentation(image, 1.0f);
    
    NSMutableData *body = [NSMutableData data];
    
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Disposition: form-data; name=\"photo\"; filename=\"photo.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:imageData];
    [body appendData:[[NSString stringWithFormat:@"%@", endItemBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [request setHTTPBody:body];
    

    在这种情况下,图像的数据表示将被 ipload 而不是链接到图像。 你可以试试这样的。

    【讨论】:

    • 很高兴知道我会尝试一下。奇怪的是,如果我只是将一个没有正文的请求放在一起,我会收到预期的 400 错误,但是当我设置 HTTPBody 时,无论我放入什么样的数据,我总是会收到 500 错误。
    • 据我所知,没有强大的图片上传标准。在某些情况下,我什至使用 Wireshark 来构建格式正确的请求。我想现在是时候与您要上传文件的服务支持人员进行沟通了。
    • 原来是我发送数据的方式导致了错误。这解决了问题,谢谢!
    【解决方案3】:

    谷歌搜索“错误 500”。这是“内部服务器错误”。这是服务器上的错误。除了向服务器人员发送电子邮件之外,您无能为力。

    【讨论】:

    • 错误 500 也可能是由格式错误的消息或格式错误的 Content-Type(例如:JSON)引起的。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2013-08-01
    • 2011-06-07
    • 2019-10-25
    • 2016-12-18
    • 2018-06-13
    相关资源
    最近更新 更多