我对HTTPS请求有问题,我想编写一个非常简单的Java程序来读取GET请求的响应。 问题是我无法读取任何响应,并且程序在屏幕上不打印任何内容。
这是代码:
import java.io.*;
import java.net.*;
import java.util.*;
import javax.net.ssl.*;
public class Test
{
public static void main(String args[])
{
SSLSocket sock;
String host = "www.example.com";
try{
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
sock = (SSLSocket) factory.createSocket(host, 443);
}
catch(IOException e)
{
e.printStackTrace();
return;
}
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
bw.write("GET / HTTP/1.1\r\n");
bw.write("Accept: text/html\r\n");
bw.write("User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\r\n");
bw.write("\r\n");
} catch (IOException e) {
e.printStackTrace();
return;
}
try{
BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
StringBuffer buffer = new StringBuffer();
String temp;
while((temp = br.readLine()) != null)
{
buffer.append(temp);
}
br.close();
System.out.println(buffer);
}
catch(IOException e)
{
e.printStackTrace();
return;
}
}
}
我正在将SSLSocket与SSLSocketFactory一起使用,为了从服务器获取响应,我需要执行任何步骤吗?
答案 0 :(得分:0)
首先,您需要调用flush()
以确保在准备好缓冲后的数据实际上已写入套接字。
bw.write("GET / HTTP/1.1\r\n");
bw.write("Accept: text/html\r\n");
bw.write("User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\r\n");
bw.write("\r\n");
bw.flush(); // ADD THIS LINE
第二,您需要发送有效的HTTP 1.1标头。 RFC非常复杂,这是依赖备受赞誉的现有HTTP客户端库的另一个原因,但是这里和其他地方有一些信息应该有所帮助,例如this。例如,您至少缺少一个Host:标头。