Docker 具有 HTTPURLConnection 的容器之间的 400 错误 HTTP GET 请求
400 Error HTTP GET Request between Docker Containers with 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
现在我想从 Java Web 应用程序内部使用 HttpURL 连接访问 URL http://tomcat_webserver_api:8080/API/restaurants/Wochentag
。
问题:returns 400 错误
java.io.IOException: Server returned HTTP response code: 400 for URL: http://tomcat_webserver_api:8080/API/restaurants/Wochentag
代码就是这样(当我尝试通过 curl 连接到 URL 时,Headers 几乎是一样的——这在容器内有效,嗯):
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
,我会收到 200-ok HTTP 响应代码和 JSON-Data。
如果我执行 API 容器并检查日志,我可以看到 400 GET-Request。
为什么会这样?
http://172.20.0.3:8080/API/restaurants/Wochentag
- 有效
http://tomcat_webserver_api:8080/API/restaurants/Wochentag
- 无法工作,但不会出现 404 错误
请尝试给出明确的容器名称:
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
"local only" 配置需要明确的容器名称来激活 Docker 的名称查找机制。在 Swarm 模式下,您不需要设置容器名称。
我遇到了和你一样的问题,显然下划线不能作为虚拟主机,尝试删除它,例如,只使用 tomcatwebserverapi,应该可以解决你的问题。
有关主机名中有效字母的详细信息,请参阅 Can (domain name) subdomains have an underscore "_" in it?。
我在 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
现在我想从 Java Web 应用程序内部使用 HttpURL 连接访问 URL http://tomcat_webserver_api:8080/API/restaurants/Wochentag
。
问题:returns 400 错误
java.io.IOException: Server returned HTTP response code: 400 for URL: http://tomcat_webserver_api:8080/API/restaurants/Wochentag
代码就是这样(当我尝试通过 curl 连接到 URL 时,Headers 几乎是一样的——这在容器内有效,嗯):
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
,我会收到 200-ok HTTP 响应代码和 JSON-Data。
如果我执行 API 容器并检查日志,我可以看到 400 GET-Request。
为什么会这样?
http://172.20.0.3:8080/API/restaurants/Wochentag
- 有效
http://tomcat_webserver_api:8080/API/restaurants/Wochentag
- 无法工作,但不会出现 404 错误
请尝试给出明确的容器名称:
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
"local only" 配置需要明确的容器名称来激活 Docker 的名称查找机制。在 Swarm 模式下,您不需要设置容器名称。
我遇到了和你一样的问题,显然下划线不能作为虚拟主机,尝试删除它,例如,只使用 tomcatwebserverapi,应该可以解决你的问题。
有关主机名中有效字母的详细信息,请参阅 Can (domain name) subdomains have an underscore "_" in it?。