Spring Boot com.fasterxml.jackson.core.JsonParseException: нераспознанный токен - PullRequest
0 голосов
/ 09 февраля 2019

Я работаю с проектом Spring Boot, и я хотел бы выполнить несколько запросов POST после запуска программы, чем впоследствии использовать cURL вручную.Цель состоит в том, чтобы сохранить несколько данных в хранилище и подготовить платформу к дальнейшим операциям.Исходная команда cURL, которую я использую (которая работала нормально),

$ curl -i -X POST -H "Content-Type:application/json" -d "{\"name_of_doctor\" : \"Monika2\", \"price\": \"12.5\"}" http://localhost:8080/api/v1/appointments/createAppointment 

API, который ее принимает,

@PostMapping(value = "/createAppointment", consumes = "application/json;charset=UTF-8", produces = "application/json;charset=UTF-8")
    public ResponseEntity<Appointment> create(@RequestBody Appointment appointment) {

        java.sql.Date date = new java.sql.Date(Calendar.getInstance().getTime().getTime());
        java.sql.Time time = new java.sql.Time(Calendar.getInstance().getTime().getTime());

        appointment.setAppointment_date(date);
        appointment.setCraeted_at(time);

        // we create the appointment, because, the doctor is available
        appointment.setStatus(new Status(true));
//        appointment.setStatus(true);

        service.save(appointment);
        return ResponseEntity.status(HttpStatus.CREATED).body(appointment);
    }

Теперь я делаю это сразу после загрузки Spring,

@SpringBootApplication
@EnableTransactionManagement
public class AppointmentApplication {

    public static void main(String[] args) {



        System.out.println("\n\nAppointment Manager\n\n");
        SpringApplication.run(AppointmentApplication.class, args);



        HttpClient client = HttpClientBuilder.create().build();
        HttpPost post = new HttpPost("http://localhost:8080/api/v1/appointments/createAppointment");


        List<NameValuePair> arguments = new ArrayList<>(2);

        arguments.add(new BasicNameValuePair("name_of_doctor", "Monika"));
        arguments.add(new BasicNameValuePair("price", "12.5"));

        try {
            post.setEntity(new UrlEncodedFormEntity(arguments));
//post.addHeader("content-type", "application/x-www-form-urlencoded");
        post.setHeader("Accept", "application/json");
        post.setHeader("Content-type", "application/json");

            HttpResponse response = client.execute(post);

            System.out.println(EntityUtils.toString(response.getEntity()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Я получаю следующую ошибку:

{"timestamp":"2019-02-09T06:45:36.393+0000","status":400,"error":"Bad Request","message":"JSON parse error: Unrecognized token 'name_of_doctor': was expecting 'null', 'true', 'false' or NaN; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'name_of_doctor': was expecting 'null', 'true', 'false' or NaN\n at [Source: (PushbackInputStream); line: 1, column: 16]","path":"/api/v1/appointments/createAppointment"}

Как правильно настроить данные мультимедиа в этом сценарии для вызова POST?

1 Ответ

0 голосов
/ 09 февраля 2019

Следующий код добавляет значения в качестве параметров запроса.

    post.setEntity(new UrlEncodedFormEntity(arguments));

Учитывая, что ваш API ожидает JSON содержимого в теле запроса, вам нужно использовать StringEntity вместо UrlEncodedFormEntity

    post.setEntity(new StringEntity("{ \"name_of_doctor\": \"\", \"price\": \"12.5\" }", Charset.forName("UTF-8")));
...