我必须使用HTTP请求向一些嵌入了http server的应用程序发送一些命令。我正在使用套接字,到目前为止我做了这个但是我有点迷失了:
URI uri = URI.create(rawData);
try {
String host = uri.getHost();
String path = uri.getRawPath( );
if (path == null || path.length( ) == 0) {
path = "/";
}
String protocol = uri.getScheme( );
int port = uri.getPort( );
if (port == -1) {
if (protocol.equals("http")) {
port = 80; // http port
}
else if (protocol.equals("https")) {
port = 443; // https port
}
}
Socket socket = new Socket( host, port );
PrintWriter request = new PrintWriter( socket.getOutputStream() );
request.print( "GET " + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
request.flush( );
这就是我需要做的吗?
rawData的一个示例是"http://somemessage"
。协议是否正确编写?
感谢
答案 0 :(得分:4)
这就是我需要做的吗?
不。
您需要处理回复,处理您可能收到的各种回复时会很复杂。
您处理HTTPS的方式完全错误。您需要处理SSL连接协商......如果您尝试使用普通套接字执行此操作,则需要进行大量编码。
rawData的一个示例是
"http://somemessage"
什么是奇怪的网址。 “//”之后的内容应该是(或包含)可解析的主机名或IP地址。如果您尝试使用Web浏览器获取类似的URL,则无法使用。
协议是否写得正确?
当然,URL写得不正确。如果您尝试将所谓的URL与HttpURLConnection
或任何其他客户端HTTP API(请参阅下文)一起使用,它将无法运行 !!!
典型的格式良好的URL(在这种情况下,具有显式端口号)如下所示:
http://example.com:8080/path/to/resource
您还可以以相对形式表达URI; e.g。
http:/path/to/resource
或
http:relpath/to/resource
甚至
resource
但是这两种形式需要先变成绝对(URL)形式才能被客户端库使用。
但坦率地说,这是错误的做事方式。 Java SE库中以及Apache HTTP库中存在客户端HTTP / HTTPS堆栈的现有实现。试图重新实现它们是浪费时间。
答案 1 :(得分:1)
您可以根据需要使用更高级别的JDK API而不是较低级别的套接字 API。请参阅以下链接 -
http://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.html
http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HttpsURLConnection.html
以下是 HttpURLConnection API的示例代码段 -
String urlString = "http://myhost/mywebapp/myresource";
URL url= new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(timeout);
conn.setRequestMethod("GET");
conn.getResponseCode();