java - (Java) 自定义低级 HTTPS get/post 请求

标签 java ssl https request protocols

我想发出自己的 GET/POST 请求。我可以在它是 HTTP 时执行此操作,但 HTTPS 对我不起作用。我不想使用 HttpURLConnection。

我试过的东西:

Socket s = SSLSocketFactory.getDefault().createSocket(new InetSocketAddress("https://www.google.com/", 443).getAddress(), 443);
s.setSoTimeout(60*1000);

String request = "GET https://www.google.com/ HTTP/1.1\r\n";
String[] headersArray = headers.split("\n");
for (int i = 0; i < headersArray.length; i++) {
    request += headersArray[i] +"\r\n";
}
request += "\r\n";

OutputStream os = s.getOutputStream();
os.write(request.getBytes("UTF8"));
os.flush();
//etc (reading response)

然而,在将请求写入输出流时,我得到:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at sun.security.ssl.InputRecord.handleUnknownRecord(Unknown Source)
at sun.security.ssl.InputRecord.read(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
at sun.security.ssl.AppOutputStream.write(Unknown Source)
at java.io.OutputStream.write(Unknown Source)

我在这里做错了什么?

请注意,我希望能够“在尽可能低的级别上”执行此操作,以便我拥有尽可能多的控制权并确切知道发送/接收的内容。我尝试使用 HttpURLConnection(从 URL 对象获取)执行此操作,但它拒绝发送我给它的某些特殊 header 。

更新:问题已解决。

刚好需要更换

new InetSocketAddress("https://www.google.com/", 443)

new InetSocketAddress("www.google.com", 443)

虽然有点奇怪的错误,但我更希望在创建套接字期间从这里得到一个错误。

最佳答案

尝试,

SSLSocket s = (SSLSocket) SSLSocketFactory.getDefault().createSocket("www.google.com", 443);
s.startHandshake();
s.setSoTimeout(60 * 1000);

OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();

String request = "GET https://www.google.com/ HTTP/1.1\r\n";
os.write(request.getBytes("UTF8"));
os.flush();

String str;
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
while ((str = reader.readLine()) != null) {
    System.out.println(str);
}

关于java - (Java) 自定义低级 HTTPS get/post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32338962/

相关文章:

java - 我可以选择在 Spring Boot 中包含/排除每个环境部署的 Controller 吗?

java - 卡夫卡点对点

docker - 无法将证书添加到 alpine linux 容器

java - SSL 身份验证在 Mule ESB 项目中不起作用(非法参数)

python - 通过 Oauth 进行身份验证时 SSL 抛出错误 185090050

java - 以下查询导致 MySQLSyntaxErrorException - 我的查询有什么问题?

ssl - 谷歌云平台虚拟机 : https

.htaccess - 强制 HTTPS 到一个目录 - 删除 WWW

java - Android 使用证书建立 HTTPSConnection

java - 如何根据JTable中的数据调整行宽?