При попытке отправить запрос POST в HTTPCLIENT -JAVA, получаю 400 Bad Request

Я пытаюсь отправить запрос с помощью JAVA HTTPCLIENT, и при этом получаю 404 Bad Request.

Я попытался написать код JAVA в Eclipse и получил 404 Bad Request, попытался отправить запрос через POSTMAN и получил HTTP-статус 500.

package com.apex.customer.service;

public class CustServicePostTest {

    public static void main(String[] args) throws ClientProtocolException, IOException {

        String url = "http://www.thomas-bayer.com/sqlrest/CUSTOMER/102";
        //create the http client
        HttpClient client = HttpClientBuilder.create().build();
        //create the post message
        HttpPost post = new HttpPost(url);

        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        urlParameters.add(new BasicNameValuePair("ID", "102"));
        urlParameters.add(new BasicNameValuePair("FIRSTNAME", "Apex"));
        urlParameters.add(new BasicNameValuePair("LASTNAME", "Consultancy"));
        urlParameters.add(new BasicNameValuePair("STREET", "Shell Blvd"));
        urlParameters.add(new BasicNameValuePair("CITY", "Fremont"));

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        HttpResponse response = client.execute(post);

        System.out.println(response.getStatusLine().getStatusCode());
        System.out.println("Parameters : " + urlParameters);
        System.out.println("Response Code: " + response);
        System.out.println(response.getStatusLine().getReasonPhrase());

    }

}

Я ищу запрос 200 OK.

Что такое HttpClientBuilder? Если это Apache HttpClient, отметьте его. И удалите тег selenium, так как ваш код, похоже, вообще не использует Selenium. Короче говоря, прочитайте описания тегов, потому что там также явно указано «НЕ ИСПОЛЬЗОВАТЬ» для этого тега httpclient.

Andreas 09.04.2019 01:51

Почему вы считаете, что sqlrest конечные точки веб-сервиса поддерживают application/x-www-form-urlencoded полезные нагрузки? Я не знаю немецкий, но, кажется, для этого требуется XML или JSON или, может быть, даже YAML.

Andreas 09.04.2019 02:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 093
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема здесь из-за нескольких ошибок:

  • Первый связан с форматом ввода. Код, который вы используете, пытается сопоставить ключ и значения, но, как я мог видеть из это руководство, он ожидает формат XML в виде простого текста в качестве входных данных.
  • Вторая ошибка заключается в том, что вы пытаетесь опубликовать сообщение поверх существующего идентификатора. В этом случае для создания ресурса следует использовать http://www.thomas-bayer.com/sqlrest/CUSTOMER/

Итак, в этом случае, чтобы заставить его работать, попробуйте что-то вроде этого:

        String url = "http://www.thomas-bayer.com/sqlrest/CUSTOMER/";
        HttpClient client = HttpClientBuilder.create().build();
        HttpPost post = new HttpPost(url);

        String xml = "<resource>";
        xml += "<ID>102</ID>";
        xml += "<FIRSTNAME>Apex</FIRSTNAME>";
        xml += "<LASTNAME>Consultancy</LASTNAME>";
        xml += "<STREET>Shell Blvd</STREET>";
        xml += "<CITY>Fremont</CITY>";
        xml += "</resource>";

        post.setEntity(new StringEntity(xml));
        HttpResponse response = client.execute(post);

        System.out.println(response.getStatusLine().getStatusCode());
        System.out.println("Response Code: " + response);
        System.out.println(response.getStatusLine().getReasonPhrase());

Также очень полезно узнать еще один способ протестировать его с помощью таких инструментов, как curl утилита командной строки. Например, вы можете опубликовать продукт следующим образом:

curl -X POST  http://www.thomas-bayer.com/sqlrest/PRODUCT/ -d '<resource><ID>103</ID><NAME>X</NAME><PRICE>2.2</PRICE></resource>'

Как только вы решите это, будет важно привыкнуть к HTTP-коды. Например, ошибка 500 означает, что что-то не так на стороне сервера, а ошибка 404 обычно означает, что вы попали в недопустимую конечную точку (она не существует).

Наконец, я не буду обсуждать, почему вы используете этот проект для отправки HTTP-запросов на сервер, но имейте в виду, что это не очень распространенный способ. В настоящее время REST с JSON был бы намного интереснее и приятнее :) Если вам это интересно, взгляните на Весенняя загрузка ОТДЫХ.

спасибо за ваш вклад в это. Я не понимал, что он ожидал в формате XML. Я новичок и изучаю концепции httplclient. Также я попробовал приведенный выше код и получил код ответа 500: внутренняя ошибка сервера.

Chaitanya Maligi 09.04.2019 03:47

Рад, что это помогло. HTTP-запросы поначалу немного сложны, но вскоре вы их освоите :)

Marcio Jasinski 09.04.2019 03:49

Только сейчас понял, что вы упомянули об ошибке 500, попробовав код выше. Вероятно, это связано с тем, что идентификатор 102 уже существует. Попробуйте изменить идентификатор, и он должен работать как положено :)

Marcio Jasinski 10.04.2019 15:17

Другие вопросы по теме