【问题标题】:Nodejs server returning Http response code 400 to JavaNodejs服务器向Java返回Http响应代码400
【发布时间】:2023-11-28 14:22:01
【问题描述】:

我有一个 java 代码,它向 nodejs 服务器发出 http post 请求。 nodejs 服务器为正确的请求执行其代码并发送回响应。然而,java 代码正在接收 Http 响应代码 400。

这是我的 java 代码的样子:

protected String httpPostRequest(URL postUrl, byte[] fields, String requestType) {
        try {
            HttpURLConnection conn = (HttpURLConnection) postUrl.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", requestType);
            conn.setRequestProperty("Content-Length", String.valueOf(fields.length));
            conn.setDoOutput(true);
            conn.getOutputStream().write(fields);
            Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
            StringBuilder sb = new StringBuilder();
            for (int c; (c = in.read()) >= 0;)
                sb.append((char) c);
            return sb.toString();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e){
            //e.printStackTrace();
        }
        return "";
    }

这是 nodejs 代码的样子:

app.post("/test", function(req, res){
    res.send("File Created");
    //res.status(200)
    res.end();
});

我试过 res.status(200).send("something"), res.send("something"), res.send("something").end();但我仍然收到响应代码 400。

编辑: 详细错误:

java.io.IOException: Server returned HTTP response code: 400 for URL: http://localhost:3000/test
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at controller.utils.http.AbstractHttpClient.httpPostRequest(AbstractHttpClient.java:30)
    at controller.utils.http.HttpClient.callExternalUrl(HttpClient.java:35)
    at model.Project.<init>(Project.java:103)
    at controller.ProjectController.createProject(ProjectController.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at controller.AbstractApplicantzController.processRequest(AbstractApplicantzController.java:114)
    at view.AbstractWebApi.doRequestAction(AbstractWebApi.java:206)
    at view.AbstractWebApi.processRequest(AbstractWebApi.java:189)
    at view.AbstractWebApi.doPost(AbstractWebApi.java:66)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 是的,这只是粘贴错误时的错误,我更新了错误。我有“/”和“/test”以及其他一些处理程序,它们都返回 400
  • 在同一个 URI 上进行简单的 GET 请求是否有同样的问题?
  • @Daphoque No Get 请求正常工作。
  • 好的,根据这个问题来自您的帖子数据,再次检查您的流程并验证内容类型,编码以及您写入数据的方式
  • @Daphoque - 是的,我认为你是对的,让我尝试几个选项,看看它是否已修复

标签: java node.js httpresponse


【解决方案1】:

您不应该自己设置 Content-Length 标头。发生错误是因为Content-Length 的值错误。

Java 将缓冲您为您发送的任何内容并为您设置此值。不要尝试自己设置。删除此行应该可以正常工作:

javaconn.setRequestProperty("Content-Length", String.valueOf(fields.length));

【讨论】:

  • 嘿,我删除了该行,但响应没有改变,仍然得到 HTTP 响应代码:400
【解决方案2】:

我也遇到过类似的情况,尤其是 POST 请求。在 Postman 中,尝试使用尾随的 '/' 而没有它来命中端点。如果您在没有斜杠的情况下收到相同的 400 响应,那么您只需要确保您的 Java 代码在发送之前添加它,或者您的 Node 代码在路由之前添加它。

【讨论】:

    【解决方案3】:

    您发布的代码在 JDK1.8.0_191 和 Node v10.15.3 中对我来说运行良好 看来您的节点服务器有问题 检查您的快速服务器代码

    【讨论】:

      【解决方案4】:

      在新规范 HTTPbis 中,对某些状态进行了扩展定义。 HTTP 400 现在不仅指请求的错误形式,还指服务器处理它的能力。作为stated here

      400(错误请求)状态码表示服务器不能或不会处理请求,因为接收到的语法无效、无意义或超出了服务器愿意处理的某些限制 .

      因此,由于请求的负载,您的节点服务器可能无法处理您的请求。尝试发布一个简单的“Hello World”,它应该可以工作。

      【讨论】: