请求POST在Apache HTTP客户端中失败

时间:2020-04-26 14:17:18

标签: json rest apache-httpclient-4.x apache-httpcomponents

我正在实现Java RMI应用程序,在这里我需要创建从RMI服务器到REST客户端的连接。我已经使用Spring Boot创建了一个REST客户端。

我现在正在实现在RMI服务器和REST客户端之间建立连接的部分。

当我尝试使用Apache HTTP客户端发送POST请求时,出现错误。

alarmServiceImpl.java

public void saveAlarm(Alarm alarm) {

      Alarm alarm1 = new Alarm();
//        alarm1.getFloorNum();
//        alarm1.getRoomNum();
//        alarm1.getSmokeLevel();
//        alarm1.getCo2level();

        try(CloseableHttpClient httpclient = HttpClients.createDefault()){
            HttpPost httpPost = new HttpPost("http://localhost:8080/addAlarm");
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
            String json = "{\r\n" +
                    "  \"floorNum\": \"2\",\r\n" +
                    "  \"roomNum\": \"10\",\r\n" +
                    "  \"smokeLevel\": \"7\",\r\n" +
                    "  \"c02level\": \"5\",\r\n" +

                    "}";

            StringEntity stringEntity = new StringEntity(json);
            httpPost.setEntity(stringEntity);
            System.out.println("Executing request " + httpPost.getRequestLine());


            ResponseHandler < String > responseHandler = response -> {
                int status = response.getStatusLine().getStatusCode();
                if (status >= 200 && status < 300) {
                    HttpEntity entity = response.getEntity();
                    return entity != null ? EntityUtils.toString(entity) : null;
                } else {
                    throw new ClientProtocolException("Unexpected response status: " + status);
                }
            };

            String responseBody = httpclient.execute(httpPost, responseHandler);
            System.out.println("----------------------------------------");
            System.out.println(responseBody);

        } catch (IOException e) {
            e.printStackTrace();
        }



    }

错误代码

Executing request POST http://localhost:8080/addAlarm HTTP/1.1
org.apache.http.client.ClientProtocolException: Unexpected response status: 400
    at rmiServer.serviceImpl.AlarmServiceImpl.lambda$saveAlarm$0(AlarmServiceImpl.java:79)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:222)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:164)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:139)
    at rmiServer.serviceImpl.AlarmServiceImpl.saveAlarm(AlarmServiceImpl.java:83)
    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 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    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)

post方法在RMI服务器中执行,我没有显示,因为它不会影响此错误。我正在寻找的另一个解决方案是,一旦POST方法正常工作,我希望能够使用getter传递JSON变量的值,以便可以使用setter从fontend设置值。

0 个答案:

没有答案