Как мне сделать HTTP 1.1 Пост в Java с классом Socket? - PullRequest
1 голос
/ 07 мая 2009

Я использую сервер Tomcat с несколькими виртуальными хостами, и мне нужно отправить некоторые данные сервлету на этом сервере из другого сервлета на другом сервере. Поскольку сервер, на котором я размещаю сообщения, использует виртуальные хосты, просто ссылаясь на этот хост по его IP-адресу, вызовет проблему (он не будет знать, с каким виртуальным хостом я пытаюсь связаться).

Вот код, который у меня есть для запуска HTTP 1.0 POST для «sub.example.com», но в этом примере «example.com» знает, только чтобы перенаправить запрос в правильный поддомен, если он настроен как дефолт. Это связано с требованием, чтобы Socket передавал InetAddress, а не имя хоста.

String host = "sub.example.com";
int port = 80;
String path = "/Servlet";
StringBuilder data = new StringBuilder();
data.append(URLEncoder.encode("NameA", "UTF-8")).append('=').append(URLEncoder.encode("ValueA", "UTF-8"));
data.append('&').append(URLEncoder.encode("NameB", "UTF-8")).append('=').append(URLEncoder.encode("NameB", "UTF-8"));

InetAddress addr = InetAddress.getByName(host);
Socket socket = new Socket(addr, port);
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));

wr.write("POST "+path+" HTTP/1.0\r\n");
wr.write("Content-Length: "+data.length()+"\r\n");
wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
wr.write("\r\n");
// Send data
wr.write(data.toString());
wr.flush();
wr.close();

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 07 мая 2009

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

4 голосов
/ 07 мая 2009

Возможно, вы захотите немного облегчить себе жизнь, используя один из высокоуровневых HTTP-клиентов, доступных в Java, например, HttpURLConnection. Вам по-прежнему придется обрабатывать создание тела запроса multipart/form-encoded, но это отнимает большую часть трудностей при построении правильно сформированного запроса и приближает ваш код к истинной области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...