Node 服务器将 Http 响应代码400返回到 Java

共6个回答, 标签: java node.js httpresponse

我有一个 java 代码, 它做一个 http 后请求到 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")、"发送"、"某事"、"某事"、"结尾"、"结尾"、"()";但我仍然得到响应代码 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.(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.AbstractHttp11Processo
第1个答案

您不应该 Content-Length 自己设置标头。出现错误的原因 Content-Length 是值错误。

Java 将缓冲您为您发送的任何内容, 并为您设置此值。不要试图自己设置它。删除此行应该会使其工作:

javaconn.setRequestProperty("Content-Length", String.valueOf(fields.length));
第2个答案

您的错误提示您的 URL 错误:

服务器返回的 HTTP 响应代码: 400 为 URL: http://localhost:3000/

当您的目标控制器/test

重新检查您的 URL 构造, 并使其指向您的http://localhost:3000/test

第3个答案

我用 jre1.8.0_112 测试了你的代码, 一切对我来说都很好。

在节点项目中, 您必须在发送之前回答状态代码, 通过这种方式:

res.status(200).send("File Created");

400 是一个糟糕的请求, 所以你必须看看在你的 URL 在 java 中的形成是否有什么畸形。 您可以从在发送之前更改状态为 200 的节点部件开始, 然后尝试与邮递员进行基本调用。

第4个答案

我有类似的东西, 尤其是开机自检请求。从邮难, 尝试击中终结点的尾随 '/', 并没有它。如果在没有尾随斜杠的情况下获得相同的 400 响应, 则只需确保 Java 代码在发送前添加该响应, 或者节点代码在路由之前添加该响应即可。

第5个答案

您发布的代码在 JDK1.8.0_191 和节点 v10.15.3 中对我来说很正常它看起来像你的节点服务器有问题检查你的快递服务器代码

第6个答案

使用新的规范 HTTPbis, 有一些状态的扩展定义。HTTP 400 现在不仅指请求的不正确形式, 还指服务器处理请求的容量。如下所述:

400 (错误请求) 状态代码指示服务器不能或不会处理请求, 因为接收到的语法无效、荒谬, 或者超过了服务器愿意处理的内容的某些限制

因此, 由于请求负载大, 可能无法从节点服务器处理您的请求。尝试开机自检只是一个简单的 "你好世界", 它应该工作。

相关问题

Java 是 "逐项传递" 还是 "按值传递"? 如何比较 Java 中的字符串? 什么是 Null Pointerexception, 我如何修复它? Node 服务器将 Http 响应代码400返回到 Java 为什么按键搜索对象中的值的速度比在 js 中使用 "in" 要慢? 如何监控 RXJS 订阅数量?