【问题标题】:How do I do a HTTP 1.1 Post in Java with the Socket class?如何使用 Socket 类在 Java 中进行 HTTP 1.1 发布?
【发布时间】:2010-10-24 07:57:01
【问题描述】:

我正在运行一个带有一些虚拟主机的 Tomcat 服务器,我需要从另一台服务器上的另一个 servlet 向该服务器上的一个 servlet 发布一些数据。因为我发布到的服务器使用虚拟主机,只是通过它的 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();

有什么想法吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    您可能需要考虑使用Apache HttpClient 而不是执行原始套接字通信。

    【讨论】:

    • 对于这个任务,它看起来像这样。但是,我还想做的是告诉远程服务器启动一个可能需要几分钟才能完成的操作。在这种情况下,我需要命令已被发送和处理的即时反馈,但我不关心它的输出(一旦我知道服务器收到了命令),它看起来像是 Apache HttpClient 类封装的。
    【解决方案2】:

    您可能会考虑使用 Java 中可用的高级 HTTP 客户端之一(例如 HttpURLConnection),让自己的生活更轻松一些。您仍然需要处理构造 multipart/form-encoded 请求正文,但它消除了构造格式良好的请求的大部分麻烦,并使您的代码更接近真实域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2022-11-20
      • 2019-08-08
      相关资源
      最近更新 更多