400 Ошибка HTTP-запроса GET между контейнерами Docker с HTTPURLConnection

У меня есть два контейнера, определенные в файле docker-compose:

 
 tomcat_webserver_api:
  image: tomcat:8
  volumes:
   - ./API/Docker/API.war:/usr/local/tomcat/webapps/API.war
  ports:
    - "8080:8080"
  depends_on:
   - mysql_database

 tomcat_webserver_anwendung:
  image: tomcat:8
  ports:
   - "8081:8080"
  volumes:
   - ./Anwendung/Docker/Anwendung.war:/usr/local/tomcat/webapps/Anwendung.war
  depends_on:
   - tomcat_webserver_api
  environment:
    API_HOST: tomcat_webserver_api
    API_PORT: 8080

Теперь я хочу получить доступ к URL-адресу http://tomcat_webserver_api:8080/API/restaurants/Wochentag из веб-приложения Java с помощью HttpURLConnection.

Проблема: возвращает ошибку 400

java.io.IOException: Server returned HTTP response code: 400 for URL: http://tomcat_webserver_api:8080/API/restaurants/Wochentag

Код такой (заголовки почти такие же, когда я пытаюсь подключиться к URL-адресу через curl - это работает внутри контейнера, да):


    URL api = UriBuilder.fromUri("http://" + "tomcat_webserver_api" + ":" + "8080" +"/API/restaurants/RestaurantSpeisen").build().toURL();

    System.setProperty("http.agent", "curl/7.52.1");

    HttpURLConnection connection = (HttpURLConnection) api.openConnection();
    connection.setRequestMethod("GET");
    connection.setRequestProperty("Host", "localhost");
    connection.setRequestProperty("User-Agent", "curl/7.52.1");
    connection.connect();

    BufferedReader in = new BufferedReader(new             InputStreamReader(connection.getInputStream(), "UTF-8"));

Если я попытаюсь подключиться к http://172.20.0.3:8080/API/restaurants/Wochentag, я получу код ответа HTTP 200-ok и данные JSON.

Если я запускаю контейнер API и проверяю журналы, я вижу 400 GET-Request.

Почему это происходит?

http://172.20.0.3:8080/API/restaurants/Wochentag — работает http://tomcat_webserver_api:8080/API/restaurants/Wochentag — не работает, но не с ошибкой 404


person Sven Guthe    schedule 28.06.2018    source источник
comment
У меня точно такая же проблема. Просто удаление '_' из имени решило это для вас, Свен?   -  person Sano babu    schedule 18.01.2021


Ответы (2)


У меня была та же проблема, что и у вас, видимо, подчеркивание не разрешено как виртуальный хост, попробуйте удалить его, например, используйте только tomcatwebserverapi, это должно решить вашу проблему.

См. Могут ли поддомены (имя домена) иметь подчеркивание _ в нем? для получения дополнительной информации о допустимых буквах в именах хостов.

person Gabriel da Gama    schedule 17.09.2018

Пожалуйста, попробуйте явные имена контейнеров:

tomcat_webserver_api:
  image: tomcat:8
  container_name: tomcat_webserver_api
  volumes:
   - ./API/Docker/API.war:/usr/local/tomcat/webapps/API.war
  ports:
    - "8080:8080"
  depends_on:
   - mysql_database

tomcat_webserver_anwendung:
  container_name: tomcat_webserver_app
  image: tomcat:8
  ports:
   - "8081:8080"
  volumes:
   - ./Anwendung/Docker/Anwendung.war:/usr/local/tomcat/webapps/Anwendung.war
  depends_on:
   - tomcat_webserver_api
  environment:
    API_HOST: tomcat_webserver_api
    API_PORT: 8080

Конфигурация «только локальная» требует явных имен контейнеров, чтобы активировать механизм поиска имен Docker. В режиме Swarm вам не нужно устанавливать имена контейнеров.

person gesellix    schedule 02.08.2018