- Sending HTTP POST Request In Java
- 12 Answers 12
- Updated answer
- Original answer
- Sending a simple form
- Sending JSON
- Sending files with java post
- Отправить запрос HTTP POST в Java
- 1. Использование java.net.URLConnection
- 2. Использование java.net.HttpUrlConnection
- 3. Использование Апача HttpClient API
- Отправка HTTP POST запроса в Java
Sending HTTP POST Request In Java
(Here id needs to be sent in a POST request) I want to send the id = 10 to the server’s page.php , which accepts it in a POST method. How can i do this from within Java? I tried this :
URL aaa = new URL("http://www.example.com/page.php"); URLConnection ccc = aaa.openConnection();
12 Answers 12
Updated answer
Since some of the classes, in the original answer, are deprecated in the newer version of Apache HTTP Components, I’m posting this update.
By the way, you can access the full documentation for more examples here.
HttpClient httpclient = HttpClients.createDefault(); HttpPost httppost = new HttpPost("http://www.a-domain.example/foo/"); // Request parameters and other properties. List params = new ArrayList(2); params.add(new BasicNameValuePair("param-1", "12345")); params.add(new BasicNameValuePair("param-2", "Hello!")); httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); //Execute and get the response. HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); if (entity != null) < try (InputStream instream = entity.getContent()) < // do something useful >>
Original answer
I recommend to use Apache HttpClient. its faster and easier to implement.
HttpPost post = new HttpPost("http://jakarata.apache.org/"); NameValuePair[] data = < new NameValuePair("user", "joe"), new NameValuePair("password", "bloggs") >; post.setRequestBody(data); // execute method and handle any error responses. . InputStream in = post.getResponseBodyAsStream(); // handle response.
for more information check this URL: http://hc.apache.org/
After trying for a while to get my hands on PostMethod it seems its actually now called HttpPost as per stackoverflow.com/a/9242394/1338936 — just for anyone finding this answer like I did 🙂
For anyone getting the same issue as @AdarshSingh, I found a solution after looking at this provided example. Just change HttpClient to CloseableHttpClient, and HttpResponse to CloseableHttpResponse!
Sending a POST request is easy in vanilla Java. Starting with a URL , we need t convert it to a URLConnection using url.openConnection(); . After that, we need to cast it to a HttpURLConnection , so we can access its setRequestMethod() method to set our method. We finally say that we are going to send data over the connection.
URL url = new URL("https://www.example.com/login"); URLConnection con = url.openConnection(); HttpURLConnection http = (HttpURLConnection)con; http.setRequestMethod("POST"); // PUT is another valid option http.setDoOutput(true);
We then need to state what we are going to send:
Sending a simple form
A normal POST coming from a http form has a well defined format. We need to convert our input to this format:
Map arguments = new HashMap<>(); arguments.put("username", "root"); arguments.put("password", "sjh76HSn!"); // This is a fake password obviously StringJoiner sj = new StringJoiner("&"); for(Map.Entry entry : arguments.entrySet()) sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue(), "UTF-8")); byte[] out = sj.toString().getBytes(StandardCharsets.UTF_8); int length = out.length;
We can then attach our form contents to the http request with proper headers and send it.
http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); http.connect(); try(OutputStream os = http.getOutputStream()) < os.write(out); >// Do something with http.getInputStream()
Sending JSON
We can also send json using java, this is also easy:
byte[] out = "" .getBytes(StandardCharsets.UTF_8); int length = out.length; http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); http.connect(); try(OutputStream os = http.getOutputStream()) < os.write(out); >// Do something with http.getInputStream()
Remember that different servers accept different content-types for json, see this question.
Sending files with java post
Sending files can be considered more challenging to handle as the format is more complex. We are also going to add support for sending the files as a string, since we don’t want to buffer the file fully into the memory.
For this, we define some helper methods:
private void sendFile(OutputStream out, String name, InputStream in, String fileName) < String o = "Content-Disposition: form-data; name=\"" + URLEncoder.encode(name,"UTF-8") + "\"; filename=\"" + URLEncoder.encode(filename,"UTF-8") + "\"\r\n\r\n"; out.write(o.getBytes(StandardCharsets.UTF_8)); byte[] buffer = new byte[2048]; for (int n = 0; n >= 0; n = in.read(buffer)) out.write(buffer, 0, n); out.write("\r\n".getBytes(StandardCharsets.UTF_8)); > private void sendField(OutputStream out, String name, String field)
We can then use these methods to create a multipart post request as follows:
String boundary = UUID.randomUUID().toString(); byte[] boundaryBytes = ("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8); byte[] finishBoundaryBytes = ("--" + boundary + "--").getBytes(StandardCharsets.UTF_8); http.setRequestProperty("Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary); // Enable streaming mode with default settings http.setChunkedStreamingMode(0); // Send our fields: try(OutputStream out = http.getOutputStream()) < // Send our header (thx Algoman) out.write(boundaryBytes); // Send our first field sendField(out, "username", "root"); // Send a seperator out.write(boundaryBytes); // Send our second field sendField(out, "password", "toor"); // Send another seperator out.write(boundaryBytes); // Send our file try(InputStream file = new FileInputStream("test.txt")) < sendFile(out, "identification", file, "text.txt"); >// Finish the request out.write(finishBoundaryBytes); > // Do something with http.getInputStream()
Отправить запрос HTTP POST в Java
В этом посте будет обсуждаться, как отправить запрос HTTP POST в Java.
1. Использование java.net.URLConnection
The URLConnection class предлагает несколько методов для связи с URL-адресом по сети. Мы можем использовать этот класс для чтения и записи непосредственно в ресурс, на который ссылается URL-адрес.
Следующая программа извлекает URLConnection объект, вызывая openConnection() метод на URL и получает входной поток, вызывая getInputStream() . Затем программа создает BufferedReader на входной поток и читает из него.
Чтобы отправить запрос HTTP POST, не забудьте установить URLConnection.setDoOutput() способ true а также записать параметры POST в выходной поток соединения.
2. Использование java.net.HttpUrlConnection
Поскольку мы работаем с HTTP, предпочтительнее использовать HttpURLConnection над суперклассом URLConnection , который поставляется с поддержкой специфичных для HTTP функций. Чтобы получить HttpURLConnection объект, просто отлитый URLConnection экземпляр к HttpURLConnection .
Затем, чтобы отправить запрос HTTP POST, передайте POST строковый литерал для setRequestMethod() метод HttpURLConnection объект. Это, без сомнения, лучшая альтернатива, чем полагаться на setDoOutput() метод URLConnection учебный класс.
3. Использование Апача HttpClient API
Если ваш проект открыт для внешних библиотек, рассмотрите возможность использования Apache HttpClient API для выполнения HTTP-методов. HttpClient внутренне обрабатывает один или несколько обменов HTTP-запросами/HTTP-ответами, необходимыми для успешного выполнения HTTP-метода. Ожидается, что пользователь предоставит объект запроса для выполнения, и HttpClient ожидается, что он передаст запрос на целевой сервер, вернет соответствующий объект ответа или выдаст исключение, если выполнение было неудачным.
Вот простой пример, демонстрирующий, как мы можем использовать HttpClient API для отправки запроса HTTP POST. Пожалуйста, обратитесь к официальному Примеры HttpClient чтобы получить более глубокое представление обо всех функциях, предлагаемых этим модулем.
Отправка HTTP POST запроса в Java
Проблема отправки HTTP POST запроса в Java является распространенной задачей, с которой сталкиваются разработчики при работе с веб-сервисами. Например, есть веб-страница, которая принимает POST запросы с определенными параметрами. Необходимо написать код на Java, который будет отправлять такой запрос.
В Java для работы с HTTP предусмотрены специальные классы, такие как HttpURLConnection и HttpClient . Ниже представлен пример кода, который демонстрирует, как можно отправить POST запрос с помощью класса HttpURLConnection .
try < URL url = new URL("http://www.example.com/page.php"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); String params = "id=10"; byte[] postData = params.getBytes(StandardCharsets.UTF_8); try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) < wr.write(postData); >try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), «UTF-8»))) < String inputLine; while ((inputLine = in.readLine()) != null) < System.out.println(inputLine); >> > catch (IOException e)
В этом примере создается объект HttpURLConnection , устанавливается метод запроса POST и активируется возможность отправки данных. Затем формируются данные для отправки, которые записываются в поток вывода соединения. В конце происходит чтение ответа от сервера.
Начиная с Java 11, доступен еще один способ для отправки HTTP запросов — класс HttpClient . Пример отправки POST запроса с помощью этого класса:
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://www.example.com/page.php")) .POST(HttpRequest.BodyPublishers.ofString("id=10")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
Здесь создается объект HttpClient , формируется POST запрос с помощью HttpRequest.Builder , а затем отправляется запрос и получается ответ от сервера.