Служба REST выдает «400 неверных запросов», когда POST a JSON in Java - PullRequest
1 голос
/ 19 апреля 2020

Я внедряю услугу RESTful. API REST реализован в Node.js. Когда я пытаюсь отправить объект JSON, он выдает ошибку 400 Bad Request. После поиска по inte rnet я обнаружил, что мои клиентские программы отправляют с сервера что-то неприемлемое (вот что я понял. Если не так, пожалуйста, научите меня). Я могу быть уверен, что REST API и URL работают нормально, так как я реализовал метод GET, который работает нормально, как я ожидал. Я реализовал метод POST в java, сославшись на этот пример. Как я могу исправить эту проблему?

Метод POST в Java (Клиент). Комментированные строки - это способы, которыми я пытался создать строковую переменную в соответствии с json object

    public void addSensor(int floorNo, String roomNo) {

//      String POST_PARAMS = "{\n" + "\"floorNo\": "+floorNo+",\r\n" +
//              "    \"roomNo\": \""+roomNo+"\",\r\n" +
//              "    \"smokeLevel\": "+0+",\r\n" +
//              "    \"Co2Level\": "+0+",\r\n" +
//              "   \"status\": \"Inactive\"" + "\n}";
        //String POST_PARAMS = "{\"floorNo\": "+floorNo+"}";

        String POST_PARAMS = "{\"floorNo\": "+floorNo+",\"roomNo\": \""+roomNo+"\",\"smokeLevel\": "+0+",\"Co2Level\": "+0+",\"status\": \"Inactive\"}";

        System.out.println(POST_PARAMS);
        //String jsonString = "{\"floorNo\":"+floorNo+",\"roomNo\":"+roomNo+", \"smokeLevel\":\"0\", \"Co2Level\":\"0\", \"status\":\"Inactive\"}";

        try {
            URL url = new URL("http://localhost:8000/api/sensors");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json;utf-8");
            //conn.setRequestProperty("Accept", "application/json");
            conn.setDoOutput(true);

            OutputStream outputStream = conn.getOutputStream();
            outputStream.write(POST_PARAMS.getBytes());
            outputStream.flush();
            outputStream.close();

            int responseCode = conn.getResponseCode();
            System.out.println("POST Response Code :  " + responseCode);
            System.out.println("POST Response Message : " + conn.getResponseMessage());
            if (responseCode == HttpURLConnection.HTTP_CREATED) { //success
                BufferedReader in = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = in .readLine()) != null) {
                    response.append(inputLine);
                } in .close();
                // print result
                System.out.println(response.toString());
            } else {
                System.out.println("POST NOT WORKED");
            }


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }//your url i.e fetch data from .

    }

POST-методом в API (Node.js)

app.post('/api/sensors', function (req, res) {

        let floorNo = req.body.floorNo;
        let roomNo = req.body.roomNo;
        let smokeLevel = req.body.smokeLevel;
        let Co2Level = req.body.Co2Level;
        let status = req.body.status;

        if (!floorNo || !roomNo || !smokeLevel || !Co2Level || !status) {
            return res.status(400).send({error: true, message: 'Please Enter sensor details'});
        }

        dbConn.query("INSERT INTO Sensors SET ?",{floorNo:floorNo, roomNo:roomNo,smokeLevel:smokeLevel,Co2Level:Co2Level,status:status},function (error, results, fields) {
            if (error) throw error;
            return res.send({
                error: false,
                data: results,
                message: 'New sensor has been added to the system successfully.'
            });
        });
    });

Выходные данные

{"floorNo": 3,"roomNo": "A3","smokeLevel": 0,"Co2Level": 0,"status": "Inactive"}
POST Response Code :  400
POST Response Message : Bad Request
POST NOT WORKED

1 Ответ

1 голос
/ 22 апреля 2020

У меня была та же проблема, и я попытался передать все значения в виде строк в переменную JSON. Это сработало для меня. Попробуйте вот так:

String POST_PARAMS = "{\n" + "\"floorNo\":"+"\""+floorNo+"\",\r\n" +
                "    \"roomNo\":"+"\""+roomNo+"\",\r\n" +
                "    \"smokeLevel\":"+"\""+0+"\",\r\n" +
                "    \"Co2Level\":"+"\""+0+"\",\r\n" +
                "   \"status\": \"Inactive\"" + "\n}";
...