Отправить POST-запрос в ванильной Java легко. Начиная с a URL, нам нужно преобразовать его в a URLConnection используя url.openConnection();. После этого нам нужно преобразовать его в HttpURLConnection, чтобы мы могли получить доступ к его setRequestMethod() методу, чтобы установить наш метод. Наконец, мы говорим, что собираемся отправлять данные по соединению.
URLurl=newURL("https://www.example.com/login"); URLConnectioncon= url.openConnection(); HttpURLConnectionhttp= (HttpURLConnection)con; http.setRequestMethod("POST"); // PUT is another valid option http.setDoOutput(true);
Затем нам нужно указать, что мы собираемся отправить:
Отправка простой формы
Обычный POST, поступающий из http-формы, имеет четко определенный формат. Нам нужно преобразовать наши входные данные в этот формат:
Map<String,String> arguments = newHashMap<>(); arguments.put("username", "root"); arguments.put("password", "sjh76HSn!"); // This is a fake password obviously StringJoinersj=newStringJoiner("&"); for(Map.Entry<String,String> 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); intlength= out.length;
Затем мы можем прикрепить содержимое нашей формы к http-запросу с соответствующими заголовками и отправить его.
http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); http.connect(); try(OutputStreamos= http.getOutputStream()) { os.write(out); } // Do something with http.getInputStream()
Отправка JSON
Мы также можем отправить json с помощью Java, это тоже просто:
byte[] out = "{\"username\":\"root\",\"password\":\"password\"}" .getBytes(StandardCharsets.UTF_8); intlength= out.length;
http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); http.connect(); try(OutputStreamos= http.getOutputStream()) { os.write(out); } // Do something with http.getInputStream()
Помните, что разные серверы принимают разные типы контента для json, смотрите Этот вопрос.
Отправка файлов с помощью java post
Отправка файлов может считаться более сложной в обработке, поскольку формат более сложный. Мы также собираемся добавить поддержку отправки файлов в виде строки, поскольку мы не хотим полностью помещать файл в буфер памяти.
Для этого мы определяем несколько вспомогательных методов:
privatevoidsendFile(OutputStream out, String name, InputStream in, String fileName) { Stringo="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 = newbyte[2048]; for (intn=0; n >= 0; n = in.read(buffer)) out.write(buffer, 0, n); out.write("\r\n".getBytes(StandardCharsets.UTF_8)); }
Первый ответ был отличным, но мне пришлось добавить try / catch, чтобы избежать ошибок компилятора Java. Кроме того, у меня возникли проблемы с пониманием того, как читать HttpResponse с библиотеками Java.
Вот более полный код :
/* * Create the POST request */ HttpClienthttpClient=newDefaultHttpClient(); HttpPosthttpPost=newHttpPost("http://example.com/"); // Request parameters and other properties. List<NameValuePair> params = newArrayList<NameValuePair>(); params.add(newBasicNameValuePair("user", "Bob")); try { httpPost.setEntity(newUrlEncodedFormEntity(params, "UTF-8")); } catch (UnsupportedEncodingException e) { // writing error to Log e.printStackTrace(); } /* * Execute the HTTP Request */ try { HttpResponseresponse= httpClient.execute(httpPost); HttpEntityrespEntity= response.getEntity();
if (respEntity != null) { // EntityUtils to get the response content Stringcontent= EntityUtils.toString(respEntity); } } catch (ClientProtocolException e) { // writing exception to log e.printStackTrace(); } catch (IOException e) { // writing exception to log e.printStackTrace(); }