Вопрос-ответ

Java - sending HTTP parameters via POST method easily

Java - простая отправка HTTP-параметров с помощью метода POST

Я успешно использую этот код для отправки HTTP запросов с некоторыми параметрами с помощью GET метода:

void sendRequest(String request) {
// i.e.: request = "http://example.com/index.php?param1=a&param2=b&param3=c";
URL url = new URL(request);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type", "text/plain");
connection.setRequestProperty("charset", "utf-8");
connection.connect();
}

Теперь мне, возможно, потребуется отправить параметры (т. Е. param1, param2, param3) с помощью POST метода, потому что они очень длинные.
Я думал добавить дополнительный параметр к этому методу (т.Е. String HttpMethod).

Как я могу изменить приведенный выше код как можно меньше, чтобы иметь возможность отправлять параметры либо через GET, либо POST?

Я надеялся, что изменение

connection.setRequestMethod("GET");

Для

connection.setRequestMethod("POST");

могло бы сработать, но параметры по-прежнему отправляются с помощью метода GET .

У HttpURLConnection есть какой-нибудь метод, который мог бы помочь? Есть ли какая-нибудь полезная конструкция Java?

Любая помощь была бы очень признательна.

Переведено автоматически
Ответ 1

В запросе GET параметры отправляются как часть URL-адреса.

В запросе POST параметры отправляются как тело запроса, после заголовков.

Чтобы создать POST с помощью HttpURLConnection, вам необходимо записать параметры в соединение после того, как вы открыли соединение.

Этот код должен помочь вам начать:

String urlParameters  = "param1=a&param2=b&param3=c";
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
int postDataLength = postData.length;
String request = "http://example.com/index.php";
URL url = new URL( request );
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty( "charset", "utf-8");
conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
conn.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
wr.write( postData );
}
Ответ 2

Вот простой пример, который отправляет форму, а затем выводит страницу результатов в System.out. Измените URL и параметры POST соответствующим образом, конечно:

import java.io.*;
import java.net.*;
import java.util.*;

class Test {
public static void main(String[] args) throws Exception {
URL url = new URL("http://example.net/new-message.php");
Map<String,Object> params = new LinkedHashMap<>();
params.put("name", "Freddie the Fish");
params.put("email", "fishie@seamail.example.com");
params.put("reply_to_thread", 10394);
params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish.");

StringBuilder postData = new StringBuilder();
for (Map.Entry<String,Object> param : params.entrySet()) {
if (postData.length() != 0) postData.append('&');
postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
postData.append('=');
postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
}
byte[] postDataBytes = postData.toString().getBytes("UTF-8");

HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
conn.setDoOutput(true);
conn.getOutputStream().write(postDataBytes);

Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

for (int c; (c = in.read()) >= 0;)
System.out.print((char)c);
}
}

Если вы хотите получить результат в виде String вместо прямой распечатки, сделайте:

        StringBuilder sb = new StringBuilder();
for (int c; (c = in.read()) >= 0;)
sb.append((char)c);
String response = sb.toString();
Ответ 3

Я не смог заставить пример Алана на самом деле выполнить post, поэтому в итоге я получил это:

String urlParameters = "param1=a&param2=b&param3=c";
URL url = new URL("http://example.com/index.php");
URLConnection conn = url.openConnection();

conn.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

writer.write(urlParameters);
writer.flush();

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

while ((line = reader.readLine()) != null) {
System.out.println(line);
}
writer.close();
reader.close();
Ответ 4

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

Приведенный выше пример можно было бы записать следующим образом:

Webb webb = Webb.create();
webb.post("http://example.com/index.php")
.param("param1", "a")
.param("param2", "b")
.param("param3", "c")
.ensureSuccess()
.asVoid();

Вы можете найти список альтернативных библиотек по предоставленной ссылке.

java