【问题标题】:NSData POST HttpRequest error Objective CNSData POST HttpRequest 错误目标 C
【发布时间】:2014-03-21 09:31:09
【问题描述】:

我想将我通过 DocuSign API 作为 NSData 获得的文档发送到有服务的网站。

服务是

POST /api/v1/rest/groups/[:idgroup]/documents/upload/[:oauthtoken]

需要的参数是:

  1. file --> 要上传的文件(类型:inputstream)
  2. fileName --> 要上传的新文件的名称(类型:字符串)
  3. length --> 上传文件的字节大小(类型:long)

我正在尝试使用此示例 Uploading Image via POST in Objective C 执行请求,但我有一个服务错误提示 "InvalidParametersServiceApiException"

我的代码是:

NSString *filename = @"docusignTest.pdf";
NSMutableURLRequest* request= [[NSMutableURLRequest alloc] init];

[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

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

[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *postbody = [NSMutableData data];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileName\"; \r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

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

[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"length\"; \r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

[postbody appendData:[[NSString stringWithFormat:@"\r\n%lu",(unsigned long)oResponseData.length] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

[postbody appendData:[NSData dataWithData:oResponseData]];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:postbody];

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

【问题讨论】:

  • 我看不到您实际将 PDF 转换为数据并包含在正文中的位置?
  • 数据是oResponseData,它是正确的,因为如果我将数据保存为 PDF,我可以正确读取它。 oResponseData 是我获得的 DocuSign 服务的响应,如本例所示 iodocs.docusign.com/APIWalkthrough/getEnvelopeDocuments

标签: objective-c httprequest docusignapi http-post


【解决方案1】:

这里有一个建议:不要忽略响应和错误,而是让 sendSynchronousRequest 将它们都提供给您,然后检查您得到的结果。在没有任何错误处理的情况下发送 POST 请求是相当疯狂的。您发送的数据可能是错误的,并且服务器因希望您正确处理而臭名昭著,但是好的服务器会告诉您哪里出了问题。服务器可能有问题。网址可能有误。设备可能没有连接。

并且准确地发布您收到的内容,无需您进行任何解释,这可能会有所帮助。阅读您正在调用的服务的文档也可能会有所帮助。没有两个服务是相同的。

【讨论】:

  • 关于服务的文档只是我在问题中发布的有关所需参数的信息。数据是正确的,URL 也是正确的,因为如果我在 vb.net 中执行此请求,一切正常,但我从目标 C 开始,我不知道该怎么做。
【解决方案2】:

这个link的例子很有帮助。

NSString *filename = @"docusignTest.pdf";

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

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

[request addValue:contentType forHTTPHeaderField:@"Content-Type"];

NSMutableData *body = [NSMutableData data];

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

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

[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileName\"\r\n\r\n%@", filename] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"length\"\r\n\r\n%d", oResponseData.length] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:body];

NSURLResponse *response;
NSError *error2;

NSData *oResponseData2 = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error2];

NSMutableString *jsonResponse2 = [[NSMutableString alloc] initWithData:oResponseData2 encoding:NSUTF8StringEncoding];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多