【问题标题】:HTTP POST request using form-data in java returns 400在 java 中使用表单数据的 HTTP POST 请求返回 400
【发布时间】:2021-02-02 11:23:42
【问题描述】:

我在 java 中发出一个 post 请求并得到 400 作为响应代码。但是在 Postman 中构造相同的请求会得到 200.

这是我用于发出请求的 Java 代码:-

    final URI baseUri = new URIBuilder("localhost:8080/api/service?ask=true&uid=user&pp=secret").build();
    final URIBuilder applicationUriBuilder = new URIBuilder(baseUri);
    URI applicationURI = applicationUriBuilder.build();
    HttpPost httpPost = new HttpPost(applicationURI);
    
    File resumeFile = resourceLoader.getResource("classpath:/data/2655386.docx").getFile(); 
StringBody userDetailsString = new StringBody(objectMapper.writeValueAsString(userProfileDetails), MULTIPART_FORM_DATA);
    FileBody fileBody = new FileBody(resumeFile, DEFAULT_BINARY);
    
    MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
    entityBuilder.addPart("props",userDetailsString);
    entityBuilder.addPart("file",fileBody);
    entityBuilder.addTextBody("contentField","CONTENT");
    HttpEntity entity = entityBuilder.build();
    httpPost.setEntity(entity);
    httpPost.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE);
    httpPost.addHeader(HttpHeaders.ACCEPT,"*/*");
    CloseableHttpResponse httpResponse = httpClient.execute(httpPost))
    String json = EntityUtils.toString(httpResponse.getEntity());

我收到此错误

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 400 Bad Request</title>
</head>
<body><h2>HTTP ERROR 400</h2>
<p>Problem accessing localhost:8080/api/service?ask=true&uid=user&pp=secret. Reason:
<pre>    Bad Request</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/>

</body>
</html>

有人可以建议代码有什么问题吗?提前致谢

【问题讨论】:

  • 也许“内容类型”(MIME 类型)不匹配会引发此错误。 Postman 不会阻止此问题,但浏览器对“内容类型”问题非常严格。你能分享 Postman 的“标题”标签图片吗?
  • 标题在邮递员中是空白的,如您在图像中看到的。但是在 curl 请求标头中是 -H 'cache-control: no-cache' \ -H 'content-type: multipart/form-data;边界=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ -H '邮递员令牌:333231ef-55ee-c6b3-73fa-6eb21e454685' \
  • @Md.KawserHabib 你是对的,这是由于内容类型不匹配而发生的。当我添加 content-type: "/" 时,它起作用了。对此有何解释?
  • 我在回答部分写了详细的解释。

标签: java spring-boot http-post


【解决方案1】:

也许 'content-type'(MIME 类型)不匹配会引发此错误。 Postman 不会阻止此问题,但浏览器对“内容类型”问题非常严格。对于文件类型,它将是 multipart/form-data。

Content-Type: multipart/form-data;

为了降低安全风险浏览器检查请求和响应 MIME 类型。如果它们不匹配,则浏览器/服务器端会阻止内容/内容传递。这是一项安全功能。从浏览器等客户端,您可以停止 MIME 类型检查。对于服务器端也是如此。但这会增加安全风险。

wiki我们可以找到安全风险的基本思路,

内容嗅探,也称为媒体类型嗅探MIME嗅探,是检查字节流的内容以尝试推断出里面的数据。内容嗅探通常用于弥补准确元数据的缺乏,否则需要这些元数据才能正确解释文件。内容嗅探技术倾向于使用多种技术,这些技术依赖于大多数文件格式中的冗余:查找文件签名和幻数,以及启发式方法,包括搜索著名的代表性子字符串、字节频率的使用和 n-gram表和贝叶斯推理。

有关 MIME 类型的更多信息,您可以阅读此article

【讨论】:

  • @ak1234,这个答案有用吗?
猜你喜欢
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
相关资源
最近更新 更多