AFHttpSessionManager - 导致 org.codehaus.jackson.JsonParseException 的多部分 POST

Posted

技术标签:

【中文标题】AFHttpSessionManager - 导致 org.codehaus.jackson.JsonParseException 的多部分 POST【英文标题】:AFHttpSessionManager - Multipart POST causing org.codehaus.jackson.JsonParseException 【发布时间】:2014-07-09 18:47:41 【问题描述】:

我正在尝试使用 AFNetworking 2 的 AFHTTPSessionManager 将 pdf 内容发布到我的网络服务。我将 AFHTTPSessionManager 子类化,并将请求和响应序列化程序设置为相应的 AFJsonXXXSerializer。但是,当我将表单数据作为多部分请求发布时,我得到了 JsonParseException。我很确定这是一个直接的用例,我可能会遗漏一些东西。请帮忙,提前谢谢!

[accessMgr postDataToURL:@"objects-d2" usingParams:nil fileData:imageData andDelegate:self];

调用下面的方法来POST

-(void) postDataToURL:(NSString *) urlString usingParams:(id)parameters fileData: (NSData          *)fileData andDelegate:(id<RemoteAccessDelegate>) remoteDelegate


//RESTSessionManager extends AFHTTPSessionMaanger
RESTSessionManager *manager = [self getManager:remoteDelegate];

[manager POST:urlString parameters: parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
    [formData appendPartWithFileData:fileData name:@"content" fileName:@"test.pdf" mimeType:@"application/pdf"];

请求带有以下标头和表单数据

POST /d2fs/repositories/ls67sp2/objects-d2 HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=Boundary+422AF86226B68040
Connection: keep-alive
Transfer-Encoding: Chunked
Accept: application/json
User-Agent: IIG Mobile/1.1 (iPad Simulator; ios 7.1; Scale/2.00)
Accept-Language: en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5
Authorization: Basic bHNhZG1pbjpsc2FkbWlu
Accept-Encoding: gzip, deflate

--Boundary+422AF86226B68040
Content-Disposition: form-data; name="content"; filename="test.pdf"
Content-Type: application/pdf

%PDF-1.3
%ƒÂÚÂÎßÛ†–ƒ∆
<more file content>

我已验证尾随边界也已设置。从我的网络服务得到的响应是


    "status": 400,
    "code": "E_INPUT_ILLEGAL_ARGUMENTS",
    "message": "There are illegal arguments provided.",
    "details": "org.codehaus.jackson.JsonParseException: Unexpected character ('%' (code 37)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')\n at [Source: org.apache.commons.fileupload.MultipartStream$ItemInputStream@22a5cdce; line: 1, column: 2];Unexpected character ('%' (code 37)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')\n at [Source: org.apache.commons.fileupload.MultipartStream$ItemInputStream@22a5cdce; line: 1, column: 2]"

【问题讨论】:

【参考方案1】:

我今天能够解决这个问题。在附加文件数据之前,我必须附加一个 json 对象,该对象是关于该对象的元数据,并且上传起到了作用!谢谢。

[formData appendPartWithFormData:data name:@"object"];
[formData appendPartWithFileData:fileData name:@"content" fileName:@"test.pdf" mimeType:@"application/pdf"]; 

【讨论】:

以上是关于AFHttpSessionManager - 导致 org.codehaus.jackson.JsonParseException 的多部分 POST的主要内容,如果未能解决你的问题,请参考以下文章

快速使用 AFHTTPSessionManager

使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager

AFNetworking 2.0 AFHTTPSessionManager

如何在 AFHTTPSessionManager 请求中添加原始正文?

Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?

2 AFHTTPSessionManager