Ответ "301 Moved Permanently" при GET запросе через сокет java
Я отправляю GET запрос через Socket на Java таким образом:
ip = InetAddress.getByName(new URL("https://habr.com/ru/post/215117/").getHost());
socket = new Socket(ip, 80); //Создаю сокет
PrintWriter wtr = new PrintWriter(socket.getOutputStream());
wtr.print("GET /ru/post/215117/ HTTP/1.1\r\n");
wtr.print("Host: habr.com\r\n");
wtr.print("\r\n");
wtr.flush(); //Отправляю запрос
К какому ресурсу я бы не обращался результат один:
HTTP/1.1 301 Moved Permanently
Server: QRATOR
Date: Tue, 15 Dec 2020 15:25:56 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Keep-Alive: timeout=15
Location: https://habr.com/ru/post/215117/
В ответе ошибка 301 иногда 302, как я понимаю она указывает, что сайт или страница переехали на другой адрес, который указывается в поле "Location". Проблема в том, что адрес в поле Location совпадает с тем куда я отправляю запрос, в чем ошибка?
Ответы (1 шт):
Автор решения: Владимир Карсанов
→ Ссылка
Давайте для подключения по протоколу https использовать немного другой сокет и немного другой порт (443 обычно, а не 80, как у http). Ваш код должен выглядеть как-то так:
InetAddress ip = InetAddress.getByName(new URL("https://habr.com").getHost());
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket(ip, 443);
InputStream is = socket.getInputStream();
PrintWriter wtr = new PrintWriter(socket.getOutputStream());
wtr.print("GET /ru/post/215117/ HTTP/1.1\r\n");
wtr.print("Host: habr.com\r\n");
wtr.print("\r\n");
wtr.flush(); //Отправляю запрос
//Это вывод в консоль. У вас он, вероятно свой
byte[] buffer = new byte[1024];
int read;
while ((read = is.read(buffer)) != -1) {
String output = new String(buffer, 0, read);
System.out.print(output);
System.out.flush();
};
socket.close();