我有一个Java代码,它向nodejs服务器发出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”),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)
答案 0 :(得分:0)
您不应该自己设置Content-Length
标头。由于Content-Length
的值错误,因此发生了错误。
Java将缓冲您为您发送的所有内容,并为您设置此值。不要试图自己设置它。删除此行应使其起作用:
javaconn.setRequestProperty("Content-Length", String.valueOf(fields.length));
答案 1 :(得分:0)
我也有类似的事情,尤其是在POST请求中。在邮递员中,尝试使用结尾的“ /”(不带结尾的“ /”)击中端点。如果您在一个响应中得到相同的400响应而没有结尾斜杠,那么您只需要确保Java代码在发送之前将其添加,或者在路由之前将您的Node代码添加。
答案 2 :(得分:0)
您发布的代码在JDK1.8.0_191和Node v10.15.3中对我来说运行正常 看来您的节点服务器有问题 检查您的快递服务器代码
答案 3 :(得分:0)
使用新的规范HTTPbis,对某些状态进行了扩展定义。现在,HTTP 400不仅指请求的错误形式,还指服务器处理请求的能力。为stated here:
400(错误请求)状态代码表示服务器无法或不会处理该请求,因为接收到的语法无效,无意义或对服务器愿意处理的内容有一些限制 。
因此,由于请求的负载,可能无法从节点服务器处理您的请求。尝试仅发布一个简单的“ Hello World”,它应该可以工作。