Сервер Nodejs возвращает код ответа Http 400 в Java - PullRequest
1 голос
/ 02 апреля 2019

У меня есть Java-код, который отправляет http-запрос на сервер nodejs.Сервер 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 («что-то»), res.send («что-то»), res.send («что-то»). 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)

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

С новой спецификацией HTTPbis появились расширенные определения некоторых статусов. HTTP 400 теперь относится не только к неправильной форме запроса, но и к способности сервера обработать его. Как указано здесь :

Код состояния 400 (неверный запрос) указывает, что сервер не может или не будет обрабатывать запрос, поскольку полученный синтаксис является недопустимым, бессмысленным или превышает некоторые ограничения на то, что сервер готов обработать .

Так что, вероятно, ваш запрос не может быть обработан с сервера вашего узла из-за нагрузки на запрос. Попробуйте POST просто простой "Hello World", и он должен работать.

0 голосов
/ 11 апреля 2019

У меня было нечто подобное, особенно с запросами POST.От Почтальона, попробуйте попасть в конечную точку с завершающим символом «/» и без него.Если вы получите тот же ответ 400 на ответ без косой черты, то вам просто нужно убедиться, что ваш код Java добавляет его перед отправкой, или ваш код узла делает это перед маршрутизацией.

0 голосов
/ 11 апреля 2019

Код, который вы опубликовали, работает нормально для меня в JDK1.8.0_191 и Node v10.15.3 Похоже, у вас проблема с сервером вашего узла Проверьте код вашего экспресс-сервера

0 голосов
/ 04 апреля 2019

Вы не должны устанавливать заголовок Content-Length самостоятельно. Ошибка происходит из-за неправильного значения Content-Length.

Java буферизует все, что вы отправляете для вас, и устанавливает это значение для вас. Не пытайтесь установить это самостоятельно. Удаление этой строки должно заставить ее работать:

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