java - 简单的 Java Http 客户端程序不工作
问题描述
我创建了一个简单的客户端程序,但在发送请求后它不工作并且卡住了。
在调试时它卡在这里 - int responseCode = httpClient.getResponseCode();
public class ScimClient {
public static void main(String[] args) throws Exception {
new ScimClient().sendGet();
}
private void sendGet() throws Exception {
String url = "https://official-joke-api.appspot.com/random_joke";
HttpURLConnection httpClient =
(HttpURLConnection) new URL(url).openConnection();
// optional default is GET
httpClient.setRequestMethod("GET");
//add request header
httpClient.setRequestProperty("Content-Type", "application/json");
int responseCode = httpClient.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
try (BufferedReader in = new BufferedReader(
new InputStreamReader(httpClient.getInputStream()))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
//print result
System.out.println(response.toString());
}
}
}
解决方案
每个 HttpURLConnection 实例用于发出单个请求,但到 HTTP 服务器的底层网络连接可能会被其他实例透明地共享。在请求之后对 HttpURLConnection 的 InputStream 或 OutputStream 调用 close() 方法可能会释放与此实例关联的网络资源,但不会影响任何共享的持久连接。如果持续连接当时处于空闲状态,则调用 disconnect() 方法可能会关闭底层套接字。 Java 文档
可能在调试期间,您使用相同的实例进行多次调用,如文档所述,这是不允许的。您应该创建另一个实例或调用断开连接,然后再次打开连接到同一实例以进行另一个调用。
推荐阅读
- python - 在图像上绘制相机轴
- php - 将购物车项目发送到电子邮件 PHP
- sqlite - SQLite:如何读取保存为字符串的数组并使用数组?
- firebase - Sidekick Cloud Builds:找不到“Firebase/Core”的规范
- docker - Kubernetes Pod 警告:1 个节点发生卷节点关联冲突
- html - 如何使用 XPath 1.0 获取同一行节点内的所有文本
- settings - 在 Protege 5.2 首选项中设置“语言配置文件”
- javascript - AngularJS:ng-repeat 使用对象数组的数组字段
- sql - 左连接与堆叠左连接
- python - pandas 将列与 nan 值合并