Не удается прочитать ответ с запросом HTTPS GET в Java - PullRequest
1 голос
/ 31 мая 2019

У меня проблема с 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, есть ли какая-либо процедура, которую я должен сделать, чтобы получить ответ от сервера?

1 Ответ

0 голосов
/ 31 мая 2019

Во-первых, вам нужно позвонить 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:

...