【问题标题】:Why does my multipart form-data get converted to JSON?为什么我的多部分表单数据会转换为 JSON?
【发布时间】:2016-03-11 15:40:27
【问题描述】:

我需要对一个 API 进行 POST,其中需要多部分表单数据,其中一条记录的键为“json”,值是包含 json 对象的字符串。

我正在尝试使用这样的 AndroidAnnotations:

@Post(API_CREATE_PATH + API_KEY)
CreateResponse create(Map<String,String> map);

一个有效的请求如下所示,由 Postman 完成:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="json"

{"test":"data"}
----WebKitFormBoundary7MA4YWxkTrZu0gW

实际的请求正文包含"json":"{"test":"data"}",而不是那个,我不明白为什么。

【问题讨论】:

    标签: android json jackson android-annotations


    【解决方案1】:

    您可以通过这种方式发送多部分 POST,如explained in the wiki

    @Rest(rootUrl = "http://company.com/ajax/services", converters = FormHttpMessageConverter.class)
    public interface MyRestClient extends RestClientHeaders {
    
      @Post(API_CREATE_PATH + API_KEY)
      @RequiresHeader(HttpHeaders.CONTENT_TYPE)
      CreateResponse create(MultiValueMap<String,Object> map);
    }
    
    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    map.set("test","data");
    
    client.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE);
    
    client.create(map);
    

    【讨论】:

    • 谢谢,这确实有效。我的猜测是@RequiresHeader 注释是我的代码中必要的缺失行,因为我在发送请求之前已经调用了client.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE);
    • 是的,如果没有该注释,则设置的标头不会添加到请求中。我们知道这很不方便,这整件事将在即将发布的 AA 4.0 中得到改进。 :)
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2018-01-14
    • 2014-10-09
    相关资源
    最近更新 更多