Java调用HTTP接口的几种实现方式与工具类构建
在Java后端开发中,调用外部HTTP接口是常见需求。本文将介绍从原生连接方式到Spring框架封装的几种常用方法,包括使用URL对象流读取、通过RestTemplate处理不同HTTP方法(如POST、PATCH)以及利用工具类解析JSON响应数据的完整流程。
基础方法:使用 URL 对象获取返回数据
在处理简单的HTTP请求时,可以直接使用Java标准库中的java.net.URL和URLConnection。首先,我们需要确定目标接口的地址,并确保该接口正常返回JSON格式数据。
在浏览器中访问该接口地址,可以看到预期的JSON输出内容,这验证了接口的可用性:
第1步:通过 HttpURLConnection 获取返回值
目的:使用底层API建立连接并读取响应流。
入口:java.net.URL 与 java.net.HttpURLConnection。
动作:打开连接后,使用BufferedReader包装输入流,逐行读取或拼接字符串。
代码逻辑涉及初始化HttpURLConnection实例,设置超时时间,获取输入流,并最终关闭资源。控制台将打印出接口返回的原始字符串。
运行该方法,控制台输出与浏览器一致的结果,说明数据成功获取:
第2步:通过 URL.openStream() 简化操作
目的:简化流的获取过程,减少样板代码。
入口:java.net.URL 对象的 openStream() 方法。
动作:直接调用openStream()获取InputStream,同样配合BufferedReader进行读取。
这种方式比显式创建HttpURLConnection更为简洁,适用于无需复杂配置Header的场景。
获取数据后,通常会将其赋值给变量,并利用JSON库(如JSONObject)进行解析,以便提取特定字段进行后续业务处理:
进阶方案:基于 RestTemplate 的工具类封装
在实际企业级开发中,通常推荐使用Spring提供的RestTemplate进行HTTP调用,它支持更丰富的HTTP方法映射和自动序列化/反序列化。在使用前,需引入相关依赖。若项目中未使用Spring Boot starter,可能需要单独配置RestTemplate Bean,但此处展示直接在静态方法中初始化的示例。
一、 引入必要依赖
如果需要解析JSON数据,除了基础HTTP客户端外,还需引入JSON处理库。以下示例使用了json-lib进行传统格式的解析:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<!-- JSON转换包 -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
二、 HTTP 请求工具类实现
1. 通用 POST 请求方法
RestTemplate提供了exchange方法,允许我们自定义HttpMethod、请求头HttpHeaders和请求体HttpEntity。以下代码展示了如何发送POST请求:
public class HttpClient {
/**
* 向目的URL发送post请求
*
* @param url 目的url
* @param headerParams 请求头参数 key:value
* @param bodyParams 请求体参数 key:value
* @return
*/
public static String sendPostRequest(String url, Map<String, String> headerParams,
Map<String, String> bodyParams) {
RestTemplate client = new RestTemplate();
//新建Http头,add方法可以添加参数
HttpHeaders headers = new HttpHeaders();
//给请求头设置参数
for (String key : headerParams.keySet()) {
headers.add(key, headerParams.get(key));
}
//设置请求发送方式HttpMethod.GET、HttpMethod.DELETE等
HttpMethod method = HttpMethod.POST;
// 设置提交方式这里设置成application/json格式
headers.setContentType(MediaType.APPLICATION_JSON);
//将请求头部和参数合成一个请求
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(bodyParams, headers);
//执行HTTP请求,将返回的结构使用String 类格式化(可设置为对应返回值格式的类)
ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class);
//返回类型也可以自动填充到实体类当中去,比如我自己创建了User类,当然字段名称要和返回字段一致
//ResponseEntity<User> response = client.exchange(url, method, requestEntity, User.class);
return response.getBody();
}
2. 特殊方法 PATCH 的支持
由于RestTemplate内部使用的连接机制默认可能不包含所有HTTP动词(如PATCH),在某些环境下可能需要通过反射扩展支持的HTTP方法集合。
/**
* 向目的URL发送patch请求,只比其他方式多了一个允许aptch方式的方法。
* 由于httpclient不支持patch请求,所以需要反射方式获取连接对象,增加patch方式
* @param url 目的url
* @param headerParams 请求头参数
* @param bodyParams 请求体参数
* @return AdToutiaoJsonTokenData
*/
public static String sendPatchRequest(String url, Map<String, String> headerParams,
Map<String, String> bodyParams) {
//httpclient不支持patch请求,反射方式获取连接对象,增加patch方式
allowMethods("PATCH");
RestTemplate client = new RestTemplate();
//新建Http头,add方法可以添加参数
HttpHeaders headers = new HttpHeaders();
//给请求头设置参数
for (String key : headerParams.keySet()) {
headers.add(key, headerParams.get(key));
}
//headers.add("X-HTTP-Method-Override", "PATCH");
//设置请求发送方式
HttpMethod method = HttpMethod.PATCH;
// 设置提交方式这里设置成application/json格式
headers.setContentType(MediaType.APPLICATION_JSON);
//将请求头部和参数合成一个请求
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(bodyParams, headers);
//执行HTTP请求,将返回的结构使用String 类格式化(可设置为对应返回值格式的类)
ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class);
return response.getBody();
}
//增加支持patch请求方式
private static void allowMethods(String... methods) {
try {
//获取连接类的属性,给属性添加aptch就允许aptch请求方式了
Field methodsField = HttpURLConnection.class.getDeclaredField("methods");
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(methodsField, methodsField.getModifiers() & ~Modifier.FINAL);
methodsField.setAccessible(true);
String[] oldMethods = (String[]) methodsField.get(null);
Set<String> methodsSet = new LinkedHashSet<>(Arrays.asList(oldMethods));
methodsSet.addAll(Arrays.asList(methods));
String[] newMethods = methodsSet.toArray(new String[0]);
methodsField.set(null/*static field*/, newMethods);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
三、 数据解析与应用
获取到响应字符串后,可以使用JSONObject对其结构进行拆解。以下示例展示了如何从Zoom API类似的响应中提取会议ID、开始链接及参与用户信息:
//工具类调用api接口,获取返回数据
String result = HttpClient.sendPostRequest(createZoomMeetingUrl,header,body);
JSONObject json = JSONObject.fromObject(result);
//解析获取数据
String startUrl = json.getString("start_url");
String joinUrl = json.getString("join_url");
//会议室id
int id = json.getInt("id");
//解析数据数据
JSONArray jsonArray = json.getJSONArray("users");
for(int i=0;i<jsonArray .size();i++){
String firstName = jsonArray.getJSONObject(i).getString("first_name");
...............
}
通过上述步骤,我们可以灵活地在Java后台实现对第三方API的稳定调用与数据解析。
以上就是Java实现调用对方HTTP接口得到返回数据的详细内容,更多关于Java后端HTTP客户端集成的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









