Как отправить post запрос на java
Перейти к содержимому

Как отправить post запрос на java

  • автор:

Как сделать POST-запрос с параметром?

Как сделать запрос не пустой, а с POST-параметром запроса (к примеру id)?

ArrayList infoList; private static final String JSON_URL = "http://192.168.0.1/array.php"; loadJSONFromURL(JSON_URL); //------------------------------------------------------------------------------ //начало: private void loadJSONFromURL(String url)< //создание запроса для отправки запроса по URL-адресу: StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener() < @Override public void onResponse(String response) < //получение всего объекта json из ответа: try < JSONObject object = new JSONObject(response); //у нас есть массив с именем users внутри объекта //итак, здесь мы получаем этот массив json: JSONArray jsonArray = object.getJSONArray("users"); ArrayListlistItems = getArrayListFromJSONArray(jsonArray); //создание пользовательского объекта адаптера: infoList = listItems; ListAdapter adapter = new ListViewAdapter(getApplicationContext(),R.layout.row,R.id.textViewName,listItems); //добавление адаптера в listview: listView.setAdapter(adapter); >catch (JSONException e) < e.printStackTrace(); >> >, new Response.ErrorListener() < @Override public void onErrorResponse(VolleyError error) < //отображение ошибки, если происходит: Toast.makeText(getApplicationContext(),error.getMessage(),Toast.LENGTH_SHORT).show(); >>); RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(stringRequest); > //теперь перебираем все элементы массива json: private ArrayList getArrayListFromJSONArray(JSONArray jsonArray) < ArrayListaList = new ArrayList(); try < if(jsonArray!= null)< for(int i = 0; i> >catch (JSONException js) < js.printStackTrace(); >return aList; > 

Отслеживать

8,576 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков

Как отправить POST запрос с помощью HttpURLConnection?

Добрый вечер. Начал разбираться в программировании под android и нашел много поднобных инструкций по отправке POST запроса на php сервер с помощью HttpClient, но потом выяснил что он устарел и перестал поддерживаться последим SDK который у меня установлен.

После чего узнал что следует пользоваться HttpURLConnection, но информации о том как осуществить с помощью него POST или GET запросы и обработать ответ от сервера не нашел.

Надеюсь на вашу помощь, желательно с подробными примерами. Огромное спасибо.

  • Вопрос задан более трёх лет назад
  • 38805 просмотров

2 комментария

Оценить 2 комментария

у вас эстафета вот с этим персонажем? Как отправить форму через приложение Android?
ты хот по тостеру поищи, если уж в гугле забанили!

Wolfak @Wolfak Автор вопроса
aol-nnov: к чему этот негатив?! Искал, не нашел! Поэтому и создал вопрос.
Решения вопроса 1

Минимум как-то так. А там сами обработаете что и как требуется и положено.

String myURL = "http://myserver.com"; String params = "param1=1¶m2=XXX"; byte[] data = null; InputStream is = null; try < URL url = new URL(myURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("Content-Length", "" + Integer.toString(params.getBytes().length)); OutputStream os = conn.getOutputStream(); data = params.getBytes("UTF-8"); os.write(data); data = null; conn.connect(); int responseCode= conn.getResponseCode(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); is = conn.getInputStream(); byte[] buffer = new byte[8192]; // Такого вот размера буфер // Далее, например, вот так читаем ответ int bytesRead; while ((bytesRead = is.read(buffer)) != -1) < baos.write(buffer, 0, bytesRead); >data = baos.toByteArray(); > catch (Exception e) < >finally < try < if (is != null) is.close(); >catch (Exception ex) <> > return data;

Особого отличия от HttpClient нет.

Ответ написан более трёх лет назад
Нравится 3 10 комментариев
Wolfak @Wolfak Автор вопроса

Не могу получить ответ от сервера. Пытаюсь сделать так String ResText = new String(data); чтобы вывести ответ в Toast, но пишет ошибку: Attempt to get length of null array

Wolfak @Wolfak Автор вопроса
В php файле возвращаю ответ через echo.
Wolfak @Wolfak Автор вопроса
Сделал вывод из > catch (Exception e) <, пишет ошибку: Exception: null Wolfak @Wolfak Автор вопроса Спасибо, разобрался. Добавил код выше. Wolfak @Wolfak Автор вопроса tepexob: а не подскажите, как сделать отправку файла с помощью вашего кода? Отправка файла - это чуть чуть расширенный POST запрос.
multipart/form-data

По сути нужно заполнить OutputStream дополнительно к текстовым параметрам формы еще и бинарными данными.
Вот какой-то пример есть: Upload a file using HTTPUrlConnection.

Рекомендую сначала настроить свой php и убедиться, что все работает при отправке файла через HTML-форму. Потом уже пробовать свой java-клиент. Для начала пробуйте мелкие бинарники передавать.
Смотрите, чтобы сервер ваш не согласился на прием файла очень большого размера, который ему просто некуда будет сохранить, т.е. нужно ограничение по размеру принимаемого файла. Или прием данных нежелательного содержания, например, какой-либо исполняемый код. Ну, это уже все другие вопросы.

Для отладки выводите лог и обрабатывайте ошибки буквально после каждого действия на клиенте и на сервере.

Wolfak @Wolfak Автор вопроса
tepexob: так и не смог разобраться с отправкой файлов(

Ну, а из простой html формы отправляется файл на сервер? Т.о. нужно быть уверенным, что сервер принимает нормально.
Далее, если вопрос не решится, чтобы понять в чем отличия вашего запроса от запроса из html кода, можно воспользоваться сниффером трафика, например, Wireshark. Хотя это уже не самый простой способ решения задачи — может быть лучше действительно воспользоваться готовыми решениями.

Wolfak @Wolfak Автор вопроса

tepexob: с формы файл отправляется хорошо. Из клиента под Windows Phone тоже. Я не понимаю как в outputstream добавить файл bitmap который перегоняется в byte массив, хотя примеров в интернете много. Не могу подправить свой код (который указал в данном вопросе) чтобы все работало.

Ответы на вопрос 4
Wolfak @Wolfak Автор вопроса
Разобрался, может кому пригодится:

class SendLoginData extends AsyncTask  < String resultString = null; @Override protected void onPreExecute() < super.onPreExecute(); >@Override protected Void doInBackground(Void. params) < try < String myURL = "http://site.ru/"; String parammetrs = "param1=1&param2=XXX"; byte[] data = null; InputStream is = null; try < URL url = new URL(myURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("Content-Length", "" + Integer.toString(parammetrs.getBytes().length)); OutputStream os = conn.getOutputStream(); data = parammetrs.getBytes("UTF-8"); os.write(data); data = null; conn.connect(); int responseCode= conn.getResponseCode(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (responseCode == 200) < is = conn.getInputStream(); byte[] buffer = new byte[8192]; // Такого вот размера буфер // Далее, например, вот так читаем ответ int bytesRead; while ((bytesRead = is.read(buffer)) != -1) < baos.write(buffer, 0, bytesRead); >data = baos.toByteArray(); resultString = new String(data, "UTF-8"); > else < >> catch (MalformedURLException e) < //resultString = "MalformedURLException:" + e.getMessage(); >catch (IOException e) < //resultString = "IOException:" + e.getMessage(); >catch (Exception e) < //resultString = "Exception:" + e.getMessage(); >> catch (Exception e) < e.printStackTrace(); >return null; > @Override protected void onPostExecute(Void result) < super.onPostExecute(result); if(resultString != null) < Toast toast = Toast.makeText(getApplicationContext(), resultString, Toast.LENGTH_SHORT); toast.show(); >> >

Отправка HTTP-запросов GET и POST в Java

С помощью класса HttpURLConnection из пакета java.net можно программным путем отправлять HTTP-запросы в Java. В этом мануале вы узнаете, как с помощью HttpURLConnection в Java-программе отправлять запросы GET и POST, а затем выводить ответ.

Требования

Рассмотрите возможность развертывания localhost Tomcat-сервера.

Краткое описание SpringMVCExample

GET-запрос в Java:

  • localhost:8080/SpringMVCExample/

HTTP-запрос GET в Java для страницы входа в систему

  • localhost: 8080/SpringMVCExample/login

POST-запрос в Java

  • localhost:8080/SpringMVCExample?userName=Pankaj
  • localhost:8080/SpringMVCExample/login?userName=Pankaj&pwd=apple123 — для нескольких параметров

Извлечение параметров из формы

HTML страница входа содержит следующую форму:

Login Page

  • method — POST.
  • action — home.
    • localhost: 8080/SpringMVCExample/home

    Мы можем создать POST-запрос для:

    localhost:8080/SpringMVCExample/home?userName=Pankaj

    Это будет основой для примера HttpURLConnection.

    Пример HttpURLConnection

    Ниже описаны шаги по отправке HTTP-запросов с помощью класса HttpURLConnection:

    1. Создайте URL объект из URL-строки GET или POST.
    2. Для URL объекта вызовите метод openConnection(), который возвращает экземпляр HttpURLConnection.
    3. Установите метод запроса в экземпляре HttpURLConnection (значение по умолчанию — GET).
    4. Вызовите метод setRequestProperty() для экземпляра HttpURLConnection, чтобы установить значения заголовков запроса (например, “User-Agent”, “Accept-Language” и т. д.).
    5. Для получения HTTP-кода ответа можно вызвать getResponseCode(). Так мы узнаем, был ли запрос успешно обработан или возникла ошибка HTTP.
    6. Для GET с помощью Reader и InputStream нужно прочитать ответ и обработать его соответствующим образом.
    7. Запрос POST, прежде чем код обработает ответ, должен получить OutputStream из экземпляра HttpURLConnection и записать в него параметры POST.

    Пример программы, которая с помощью HttpURLConnection отправляет запросы GET и POST:

    package com.journaldev.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class HttpURLConnectionExample private static final String USER_AGENT = "Mozilla/5.0"; private static final String GET_URL = "https://localhost:9090/SpringMVCExample"; private static final String POST_URL = "https://localhost:9090/SpringMVCExample/home"; private static final String POST_PARAMS = "userName=Pankaj"; public static void main(String[] args) throws IOException sendGET(); System.out.println("GET DONE"); sendPOST(); System.out.println("POST DONE"); > private static void sendGET() throws IOException URL obj = new URL(GET_URL); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); System.out.println("GET Response Code :: " + responseCode); if (responseCode == HttpURLConnection.HTTP_OK) < // successBufferedReader in = new BufferedReader(new InputStreamReader(con.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("GET request did not work."); > > private static void sendPOST() throws IOException URL obj = new URL(POST_URL); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", USER_AGENT); // For POST only - START con.setDoOutput(true); OutputStream os = con.getOutputStream(); os.write(POST_PARAMS.getBytes()); os.flush(); os.close(); // For POST only - END int responseCode = con.getResponseCode(); System.out.println("POST Response Code :: " + responseCode); if (responseCode == HttpURLConnection.HTTP_OK) < //successBufferedReader in = new BufferedReader(new InputStreamReader(con.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 request did not work."); > > >

    Скомпилируйте и запустите код. Он выдаст такой результат:

    GET Response Code :: 200  Home Hello world! 

    The time on the server is March 6, 2015 9:31:04 PM IST.

    GET DONE POST Response Code :: 200 User Home Page

    Hi Pankaj

    POST DONE

    Сравните этот вывод с HTTP-ответом браузера.

    Если нужно отправлять запросы GET и POST по протоколу HTTPS, то вместо java.net.HttpURLConnection нужно использовать javax.net.ssl.HttpsURLConnection. HttpsURLConnection будет обрабатывать SSL рукопожатия и шифрование.

    Подводим итоги

    В этом мануале мы разобрали, как в программе Java с помощью HttpURLConnection отправлять запросы GET и POST, а затем выводить ответ.

    Публикация с помощью Java HttpClient

    API Java HttpClient был представлен в Java 11. API реализует клиентскую часть самых последних стандартов HTTP . Он поддерживает HTTP/1.1 и HTTP/2, как синхронную, так и асинхронную модели программирования.

    Мы можем использовать его для отправки HTTP-запросов и получения их ответов. До Java 11 нам приходилось полагаться на элементарную реализацию URLConnection или сторонние библиотеки, такие как Apache HttpClient .

    В этом руководстве мы рассмотрим отправку POST-запросов с помощью Java HttpClient . Мы покажем, как отправлять как синхронные, так и асинхронные запросы POST, а также параллельные запросы POST. Кроме того, мы проверим, как добавлять параметры аутентификации и тела JSON в запросы POST.

    Наконец, мы увидим, как загружать файлы и отправлять данные формы. Поэтому мы рассмотрим большинство распространенных вариантов использования.

    2. Подготовка POST-запроса​

    Прежде чем мы сможем отправить HTTP-запрос, нам сначала нужно создать экземпляр HttpClient .

    Экземпляры HttpClient можно настроить и создать из его построителя с помощью метода newBuilder . В противном случае, если настройка не требуется, мы можем использовать метод утилиты newHttpClient для создания клиента по умолчанию:

     HttpClient client = HttpClient.newHttpClient(); 

    HttpClient будет использовать HTTP/2 по умолчанию. Он также автоматически понизится до HTTP/1.1, если сервер не поддерживает HTTP/2.

    Теперь мы готовы создать экземпляр HttpRequest из его построителя. Позже мы воспользуемся экземпляром клиента для отправки этого запроса. Минимальные параметры для POST-запроса — это URL-адрес сервера, метод запроса и тело:

     HttpRequest request = HttpRequest.newBuilder()   .uri(URI.create(serviceUrl))   .POST(HttpRequest.BodyPublishers.noBody())   .build(); 

    Тело запроса должно быть предоставлено через класс BodyPublisher . Это издатель реактивного потока, который публикует потоки тела запроса по запросу. В нашем примере мы использовали публикатор тела, который не отправляет тело запроса.

    3. Отправка POST-запроса​

    Теперь, когда мы подготовили запрос POST, давайте рассмотрим различные варианты его отправки.

    3.1. Синхронно​

    Мы можем отправить подготовленный запрос, используя этот метод отправки по умолчанию. Этот метод заблокирует наш код до тех пор, пока не будет получен ответ :

     HttpResponseString> response = client.send(request, HttpResponse.BodyHandlers.ofString()) 

    Утилита BodyHandlers реализует различные полезные обработчики, такие как обработка тела ответа как строки или потоковая передача тела ответа в файл. После получения ответа объект HttpResponse будет содержать статус ответа, заголовки и тело:

     assertThat(response.statusCode())   .isEqualTo(200);   assertThat(response.body())   .isEqualTo(""); 

    3.2. Асинхронно​

    Мы могли бы отправить тот же запрос из предыдущего примера асинхронно, используя метод sendAsync . Вместо того, чтобы блокировать наш код, этот метод сразу вернет экземпляр CompletableFuture : ****

     CompletableFutureHttpResponseString>> futureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); 

    CompletableFuture завершается с HttpResponse , как только он становится доступным:

     HttpResponseString> response = futureResponse.get();   assertThat(response.statusCode()).isEqualTo(200);   assertThat(response.body()).isEqualTo(""); 

    3.3. Одновременно​

    Мы можем комбинировать Streams с CompletableFutures , чтобы выдавать несколько запросов одновременно и ждать их ответов :

     ListCompletableFutureHttpResponseString>>> completableFutures = serviceUrls.stream()   .map(URI::create)   .map(HttpRequest::newBuilder)   .map(builder -> builder.POST(HttpRequest.BodyPublishers.noBody()))   .map(HttpRequest.Builder::build)   .map(request -> client.sendAsync(request, HttpResponse.BodyHandlers.ofString()))   .collect(Collectors.toList()); 

    Теперь давайте дождемся завершения всех запросов, чтобы мы могли обработать их ответы сразу:

     CompletableFutureListHttpResponseString>>> combinedFutures = CompletableFuture   .allOf(completableFutures.toArray(new CompletableFuture[0]))   .thenApply(future ->   completableFutures.stream()   .map(CompletableFuture::join)   .collect(Collectors.toList())); 

    Поскольку мы объединили все ответы, используя методы allOf и join , мы получили новый CompletableFuture , который содержит наши ответы:

     ListHttpResponseString>> responses = combinedFutures.get();  responses.forEach((response) ->    assertThat(response.statusCode()).isEqualTo(200);   assertThat(response.body()).isEqualTo("");   >); 

    4. Добавление параметров аутентификации​

    Мы можем установить аутентификатор на уровне клиента для HTTP-аутентификации для всех запросов :

     HttpClient client = HttpClient.newBuilder()   .authenticator(new Authenticator()    @Override   protected PasswordAuthentication getPasswordAuthentication()    return new PasswordAuthentication(   "foreach",   "123456".toCharArray());   >   >)   .build(); 

    Однако HttpClient не отправляет базовые учетные данные, пока не будет запрошен для них с заголовком WWW-Authenticate с сервера.

    Чтобы обойти это, мы всегда можем создать и отправить основной заголовок авторизации вручную:

     HttpRequest request = HttpRequest.newBuilder()   .uri(URI.create(serviceUrl))   .POST(HttpRequest.BodyPublishers.noBody())   .header("Authorization", "Basic " +   Base64.getEncoder().encodeToString(("foreach:123456").getBytes()))   .build(); 

    5. Добавление тела​

    В примерах до сих пор мы не добавляли никаких тел к нашим POST-запросам. Однако метод POST обычно используется для отправки данных на сервер через тело запроса .

    5.1. JSON-текст​

    Утилита BodyPublishers реализует различные полезные средства публикации, такие как публикация тела запроса из строки или файла. Мы можем опубликовать данные JSON как String , преобразованные с использованием набора символов UTF-8:

     HttpRequest request = HttpRequest.newBuilder()   .uri(URI.create(serviceUrl))   .POST(HttpRequest.BodyPublishers.ofString(""))   .build(); 

    5.2. Загрузка файлов​

    Давайте создадим временный файл , который мы можем использовать для загрузки через HttpClient :

     Path file = tempDir.resolve("temp.txt");   ListString> lines = Arrays.asList("1", "2", "3");   Files.write(file, lines); 

    HttpClient предоставляет отдельный метод BodyPublishers.ofFile для добавления файла в тело POST . Мы можем просто добавить наш временный файл в качестве параметра метода, а API позаботится об остальном:

     HttpRequest request = HttpRequest.newBuilder()   .uri(URI.create(serviceUrl))   .POST(HttpRequest.BodyPublishers.ofFile(file))   .build(); 

    5.3. Отправка форм​

    В отличие от файлов, HttpClient не предоставляет отдельного метода для публикации данных формы. Поэтому нам снова нужно использовать метод BodyPublishers.ofString :

     MapString, String> formData = new HashMap>();  formData.put("username", "foreach");  formData.put("message", "hello");    HttpRequest request = HttpRequest.newBuilder()   .uri(URI.create(serviceUrl))   .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData)))   .build(); 

    Однако нам нужно преобразовать данные формы из Map в String , используя пользовательскую реализацию:

     private static String getFormDataAsString(MapString, String> formData)    StringBuilder formBodyBuilder = new StringBuilder();   for (Map.EntryString, String> singleEntry : formData.entrySet())    if (formBodyBuilder.length() > 0)    formBodyBuilder.append("&");   >   formBodyBuilder.append(URLEncoder.encode(singleEntry.getKey(), StandardCharsets.UTF_8));   formBodyBuilder.append("=");   formBodyBuilder.append(URLEncoder.encode(singleEntry.getValue(), StandardCharsets.UTF_8));   >   return formBodyBuilder.toString();   > 

    6. Заключение​

    В этой статье мы рассмотрели отправку POST-запросов с использованием Java HttpClient API, представленного в Java 11 .

    Мы узнали, как создать экземпляр HttpClient и подготовить POST-запрос. Мы увидели, как отправлять подготовленные запросы синхронно, асинхронно и параллельно. Далее мы также увидели, как добавить основные параметры аутентификации.

    Наконец, мы рассмотрели добавление тела к запросу POST. Мы рассмотрели полезные нагрузки JSON, загрузку файлов и отправку данных формы.

    Как всегда, полный исходный код доступен на GitHub .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *