将 form-data 部分中的 Content-Type 指定为 application/json

Specify Content-Type in form-data part as application/json

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

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

删除 ;type=application/json,从我们的 Spring 启动服务器中产生错误。

Content type 'application/octet-stream' not supported.

所以很明显我应该为 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 请求构建器抛出这个错误。

Unexpected header: Content-Type

使用空 header Headers.of(),创建请求 body,但后来我意识到 form-data 键 config 未指定,从此API 错误。

Required request part 'config' is not present

我搜索了很多,但找不到任何关于 OkHttp 的解决方案,我在其他库中找到了解决方案,例如 Spring RestTemplate。

玩完这段代码后,我找到了一种方法来指定 Content-Type。

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

这可能也行。

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