如何在 java 中发送 http get 请求并获取特定字段
how to send http get requests in java and take a specific field
在 java 中发送 http get 请求的最简单方法是什么,例如发送到此 link https://jsonplaceholder.typicode.com/todos/1,并且只获取 id 字段?
目前这是我正在使用的代码,但显然它以 json 格式打印所有内容
int responseCode = 0;
try {
responseCode = httpClient.getResponseCode();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
StringBuilder response = new StringBuilder();
try (BufferedReader in = new BufferedReader(
new InputStreamReader(httpClient.getInputStream()))) {
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
假设您在第 3 方库的使用方面不受限制,以下是您想要实现的目标的一个非常简单的示例。
为此,它使用 Apache 的 HTTPClient to perform the GET request and Jackson 来反序列化响应。
首先,您开始创建一个模型 class 来代表您的预期响应对象:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response {
private Integer id;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
}
请注意,class 带有 @JsonIgnoreProperties(ignoreUnknown = true)
注释,指示 Jackson 忽略任何无法映射到模型 class 的属性(即在我们的例子中,除了 id
字段).
有了这个,执行 GET 请求和检索响应的 ID 字段就可以像以下示例一样简单地完成:
public class HttpClientExample {
public static void main(String... args) {
try (var client = HttpClients.createDefault()) {
var getRequest = new HttpGet("https://jsonplaceholder.typicode.com/todos/1");
getRequest.addHeader("accept", "application/json");
HttpResponse response = client.execute(getRequest);
if (isNot2xx(response.getStatusLine().getStatusCode())) {
throw new IllegalArgumentException("Failed to get with code: " + response.getStatusLine().getStatusCode());
}
Response resp = new ObjectMapper().readValue(EntityUtils.toString(response.getEntity()), Response.class);
System.out.println(resp.getId());
} catch (IOException e) {
e.printStackTrace();
}
}
private static boolean isNot2xx(int statusCode) {
return statusCode != 200;
}
}
如上所述,此示例假定您可以使用第 3 方库。另请注意,如果您使用 Java 11,则可以省略使用 Apache 的 HTTP 客户端,因为新的 JDK 与 Java 自己的 HTTP 客户端捆绑在一起,它提供了您需要的所有功能做好你的工作。
在 java 中发送 http get 请求的最简单方法是什么,例如发送到此 link https://jsonplaceholder.typicode.com/todos/1,并且只获取 id 字段?
目前这是我正在使用的代码,但显然它以 json 格式打印所有内容
int responseCode = 0;
try {
responseCode = httpClient.getResponseCode();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
StringBuilder response = new StringBuilder();
try (BufferedReader in = new BufferedReader(
new InputStreamReader(httpClient.getInputStream()))) {
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
假设您在第 3 方库的使用方面不受限制,以下是您想要实现的目标的一个非常简单的示例。
为此,它使用 Apache 的 HTTPClient to perform the GET request and Jackson 来反序列化响应。
首先,您开始创建一个模型 class 来代表您的预期响应对象:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response {
private Integer id;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
}
请注意,class 带有 @JsonIgnoreProperties(ignoreUnknown = true)
注释,指示 Jackson 忽略任何无法映射到模型 class 的属性(即在我们的例子中,除了 id
字段).
有了这个,执行 GET 请求和检索响应的 ID 字段就可以像以下示例一样简单地完成:
public class HttpClientExample {
public static void main(String... args) {
try (var client = HttpClients.createDefault()) {
var getRequest = new HttpGet("https://jsonplaceholder.typicode.com/todos/1");
getRequest.addHeader("accept", "application/json");
HttpResponse response = client.execute(getRequest);
if (isNot2xx(response.getStatusLine().getStatusCode())) {
throw new IllegalArgumentException("Failed to get with code: " + response.getStatusLine().getStatusCode());
}
Response resp = new ObjectMapper().readValue(EntityUtils.toString(response.getEntity()), Response.class);
System.out.println(resp.getId());
} catch (IOException e) {
e.printStackTrace();
}
}
private static boolean isNot2xx(int statusCode) {
return statusCode != 200;
}
}
如上所述,此示例假定您可以使用第 3 方库。另请注意,如果您使用 Java 11,则可以省略使用 Apache 的 HTTP 客户端,因为新的 JDK 与 Java 自己的 HTTP 客户端捆绑在一起,它提供了您需要的所有功能做好你的工作。