Ошибка при запросе POST с Джерси к API, отлично работает с POSTMAN - PullRequest
0 голосов
/ 05 июня 2019

Я разработал сервис API RESTful (бэкэнд) с Laravel 5 и протестировал его с POSTMAN. Есть несколько ресурсов для получения информации с помощью запросов GET и POST, они отлично работают с POSTMAN. Я начал тестировать API с клиентом Java на Джерси. Методы GET отлично работают с таким кодом, и ответом является json, который я анализирую с Джексоном.

Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target(ClientUrl);
Invocation.Builder invocationBuilder = 
webTarget.request(MediaType.APPLICATION_FORM_URLENCODED_TYPE);
Response mResponse = invocationBuilder.get();

Следующий метод, который я хочу проверить, - это вход в систему с методом POST. В POSTMAN я использую в заголовке ключ «Content-Type» + значение «application / x-www-form-urlencoded», а в теле я отправляю Json с этой информацией

{"email":"xxxxxx@gmail.com", "password":"xxxxxxxxxx"}

Чтобы использовать метод POST с Джерси, я использую следующий код

Client client = ClientBuilder.newClient();
Form mForm = new Form();
mForm.param("email", email);
mForm.param("password", password);

WebTarget target = client.target(Utils.URL_LOGIN);
//As stated in the documentation, the APPLICATION_FORM_URLENCODED = 
//"application/x-www-form-urlencoded"
Builder request = target.request(MediaType.APPLICATION_FORM_URLENCODED);
//I print the request to verify the request 
print(request.toString());
Response response =  request.post(Entity.form(mForm));
//I print the response to verify the response received and also the code 
print("Response: " + response.toString());
print("Code: " + response.getStatus());
String result = response.readEntity(String.class);
response.close();
print(result);

Когда я печатаю request.toString (), я получаю это

org.glassfish.jersey.client.JerseyInvocation$Builder@65e579dc

Когда ответ печатается

Response: InboundJaxrsResponse{context=ClientResponse{method=POST, uri=http://www.dance-world.com/api/login, status=200, reason=OK}}

Получено состояние 200, но когда я печатаю response.readEntity, я получаю ответ, который я использую в бэкэнде для тех случаев, когда сервер не получает информацию с запросом.

{"code":400,"status":"error","message":"No data attached to the request"}

Когда я использую POSTMAN и получаю результат 200, при успехе я получаю токен в виде строки.

Я не могу понять, в чем моя ошибка, потому что я следую коду в документации и с книгой RESTful Java с JAX-RS 2.0

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Я нашел причину.Я разработал бэкэнд, основанный на курсе Laravel, в этом курсе функции имеют следующее определение

 public function getByCountry(Request $request) {
        //Recoger los datos por post
        $json = $request->input('json', null);
        $params = json_decode($json);
        $params_array = json_decode($json, true);
        ...
}

А бэкэнд требует x-www-urlencoded, в POSTMAN я отправлял запрос в этом формате (запрос POST {x-www-urlencoded} с почтальоном) .Поэтому, когда я пытался сделать POST-запрос с помощью JSON, используя Jersey или Unirest, запрос не имеет требуемого формата, поэтому я настроил сообщение для тех случаев, когда сервер не получает информацию с помощью запроса. Это запрос POSTMAN с необработанными Json и . Это ответ от бэкэнда, в котором говорится, что данные не были получены.

Способ, которым я решил его принять.JSON для запросов был изменен код в бэкэнде со следующей структурой:

public function TestForPost(Request $request) {
    //Verify if the $request is a json
    $input = $request->json()->all(); //read json in request
    if (!empty($input)) {
    ...
}

С этим изменением я могу отправить запрос с Json, и бэкэнд принимает его.

0 голосов
/ 05 июня 2019

Я пробовал также с Unirest, потому что его проще использовать, чем на Джерси. Я набрал код ниже

 try {
      HttpRequestWithBody requestwithBody = Unirest.post(url)
      .header("Content-Type", "application/json")
      .header("accept", "application/json");

      RequestBodyEntity requestBodyEntity = requestwithBody.body(input);

      response = requestBodyEntity.asJson();

} catch (UnirestException e) {
    e.printStackTrace();
} finally {
    print("Status: " + String.valueOf(response.getStatus()));
    print("Body: " + String.valueOf(response.getBody()));
}

Локальный сервер не получает тело json, и я получил такой же ответ от сервера

{"code":400,"status":"error","message":"No data attached to the request"}
...