2016-10-14 2 views
1

У меня есть Java-программа, которая пытается сделать HTTP-запрос через сокет. По какой-то причине слэши в строке испортили его.Новый разъем, испорченный косой чертой?

У меня есть попытка/уловка, и она попадает, как только сокет создается со строкой, которая имеет косую черту.

 Socket socket = new Socket("www.google.ca", port); 

Response

HTTP/1.1 400 Bad Request 
Content-Length: 54 
Content-Type: text/html; charset=UTF-8 
Date: Fri, 14 Oct 2016 06:05:43 GMT 
Connection: close 

<html><title>Error 400 (Bad Request)!!1</title></html> 

Теперь с косой чертой

 Socket socket = new Socket("www.google.ca/", port); 

попадается.

Моя просьба.

  outputStream.println("GET/HTTP/1.1"); 
      outputStream.println(""); 
      outputStream.flush(); 

Я пытаюсь получить доступ к определенному сайту с именем хоста и дорогой с косой чертой. Что происходит?

+0

Исключение происходит от: https://docs.oracle.com/javase/ 7/docs/api/java/net/InetAddress.html # getByName% 28java.lang.String% 29 – dit

+0

Поскольку 'www.google.ca /' не является допустимым именем хоста. Путь к URL должен быть расположен в части 'GET'. Читайте об HTTP-протоколе. Если вы хотите подключиться к 'http: // host/path', вы должны открыть TCP-сокет для' host', затем использовать 'GET/path' и т. Д. –

ответ

1

Первая ошибка HTTP/1.1 400 Bad Request происходит из-за неправильного пути запроса. Трудно найти причину, не зная вашего кода.

Вторая ошибка происходит, как уже сказал Энди Тернер, потому что имя хоста неверно. InetAddress не может разрешить имена узлов с косой чертой.

Этот пример работает для меня:

public static void main(String[] args) throws Exception { 
    Socket s = new Socket(InetAddress.getByName("google.com"), 80); 
    PrintWriter pw = new PrintWriter(s.getOutputStream()); 
    pw.println("GET /about/ HTTP/1.1"); // here comes the path 
    pw.println("f-Modified-Since: Wed, 1 Oct 2017 07:00:00 GMT"); 
    pw.println(""); 
    pw.flush(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    String line; 
    while((line = br.readLine()) != null){ 
     System.out.println(line); 
    } 
    br.close(); 
} 

Вы просто должны установить путь в этой строке:

pw.println("GET /about HTTP/1.1"); 
+0

Хорошо имеет смысл. Хорошо для задания, над которым я работаю, я уверен, что мой профессор будет иметь свои страницы для таких. So. Может ли кто-нибудь указать мне, как отправить правильный HTTP-запрос, БЕЗ использования URL-соединения, с обновлением заголовка, который я предполагаю? –

+0

@johnstamos Я отредактировал свой ответ. – dit

+0

Выглядит отлично !!!! –

0

Более конкретно, чем IOException, вы получаете UnknownHostException (подкласс IOException), поскольку имена хостов не могут содержать косой чертой.

Вы должны печатать/регистрировать трассировку стека исключения в блоке catch; эта проблема была бы намного более очевидной.

+0

Извините, как мне сделать правильный HTTP-запрос? На путь, который я ищу. Поиск информации об этом без использования URL-соединения невозможно. –

+0

Не знаю, поскольку вы не показываете, как вы создаете HTTP-запрос. Я просто отвечаю, почему это сбой сразу с косой чертой. –

+0

То, что у меня есть для outputStream.println's, есть все, что у меня есть. В качестве параметра я передал обычный URL-адрес, например www.google.com/docs/about.html. –

Смежные вопросы