【问题标题】:Specify Content-Type in form-data part as application/json将表单数据部分中的 Content-Type 指定为 application/json
【发布时间】:2022-02-25 20:24:56
【问题描述】:

我正在使用 OkHttp3 创建一个多部分的 RequestBody。以下是有效的 curl 请求。

curl --location --request POST 'https://<url>' --form 'object=@<file_path>' --form 'config={"access":"YES"};type=application/json'

删除;type=application/json,会在我们的 Spring Boot 服务器中产生错误。

不支持内容类型“application/octet-stream”。

所以很明显我应该为config 指定Json 类型。让我们使用 OkHttp 创建请求。

String mimeType = URLConnection.getFileNameMap().getContentTypeFor(file.getName());
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
            .addFormDataPart(
                "object", filename,
                RequestBody.create(MediaType.parse(mimeType), file)
            )
            .addFormDataPart("config", "{\"access\":\"YES\"}") // CAN'T FIND A WORKING OPTION TO SPECIFY CONTENT TYPE HERE.
            .build();

这产生了与上述相同的错误。于是我把代码改成如下。

.addPart(
    Headers.of("Content-Type", "application/json"),
    RequestBody.create(MediaType.parse("application/json"), "{\"access\":\"YES\"}")
)

现在 OkHttp 请求构建器会抛出此错误。

意外的标题:内容类型

使用空标头 Headers.of() 创建请求正文,但后来我意识到未指定表单数据键 config,来自此 API 错误。

所需的请求部分“配置”不存在

找了很多,但是没有找到OkHttp的解决方案,我在Spring RestTemplate等其他库中找到了解决方案。

【问题讨论】:

    标签: java multipartform-data okhttp


    【解决方案1】:

    这也可能有效。

    .addFormDataPart(
        "config",
        null,
        RequestBody.create(MediaType.parse("application/json"), "{\"access\":\"YES\"}")
    )
    

    【讨论】:

    【解决方案2】:

    在玩过这段代码之后,我找到了一种指定 Content-Type 的方法。

    .addPart(
        Headers.of("Content-Disposition", "form-data; name=\"config\""),
        RequestBody.create(MediaType.parse("application/json"), "{\"access\":\"YES\"}")
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2019-10-26
      • 2012-07-11
      • 2018-07-17
      • 2015-08-30
      相关资源
      最近更新 更多