Java如何实现调用外部Api

 更新时间:2024年05月13日 10:28:01   作者:韩一聪  
这篇文章主要介绍了Java如何实现调用外部Api问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java调用外部Api

在日常开发的时候,经常会遇到需要调用别人的接口的场景。但是每次需要的时候,都需要百度,很麻烦,所以这里总结一下,经常调用的方法。

1.含有文件的post请求

	public static String requestOCRForHttp(String url, Map<String, String> requestParams, String filePathAndName)
			throws Exception {
		String result = null;
		CloseableHttpClient httpClient = HttpClients.createDefault();
		/** HttpPost */
		HttpPost httpPost = new HttpPost(url);
		MultipartEntity reqEntity = new MultipartEntity(); // 建立多文件实例
		FileBody filebody = new FileBody(new File(filePathAndName));
		reqEntity.addPart("pic", filebody);// upload为请求后台的File upload;
		for (String key : requestParams.keySet()) {
			String value = requestParams.get(key);
			reqEntity.addPart(key, new StringBody(value, Charset.forName("utf-8")));
		}
		httpPost.setEntity(reqEntity); // 设置实体
		/** HttpResponse */
		CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
		try {
			HttpEntity httpEntity = httpResponse.getEntity();
			result = EntityUtils.toString(httpEntity, "utf-8");
			EntityUtils.consume(httpEntity);
		} finally {
			try {
				if (httpResponse != null) {
					httpResponse.close();
				}
			} catch (IOException e) {
				logger.info("## release resouce error ##" + e);
			}
		}
		return result;
	}

2.单纯的Json

	public static String sendHttpPost(String url, String JSONBody) throws Exception {
		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpPost httpPost = new HttpPost(url);
		httpPost.addHeader("Content-Type", "application/json");
		httpPost.setEntity(new StringEntity(JSONBody));
		CloseableHttpResponse response = httpClient.execute(httpPost);
//		System.out.println(response.getStatusLine().getStatusCode() + "\n");
		HttpEntity entity = response.getEntity();
		String responseContent = EntityUtils.toString(entity, "UTF-8"); 
//		System.out.println(responseContent);
		response.close();
		httpClient.close();
		return responseContent;
	}

3.String参数

	public static String requestOCRForHttp(String url, Map<String, String> requestParams) throws Exception {
		String result = null;
		CloseableHttpClient httpClient = HttpClients.createDefault();
		/** HttpPost */
		HttpPost httpPost = new HttpPost(url);
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		Iterator<Entry<String, String>> it = requestParams.entrySet().iterator();
//		System.out.println(params.toString());
		while (it.hasNext()) {
			Entry<String, String> en = it.next();
			String key = en.getKey();
			String value = en.getValue();
			if (value != null) {
				params.add(new BasicNameValuePair(key, value));
			}
		}
		httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
		/** HttpResponse */
		CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
		try {
			HttpEntity httpEntity = httpResponse.getEntity();
			result = EntityUtils.toString(httpEntity, "utf-8");
			EntityUtils.consume(httpEntity);
		} finally {
			try {
				if (httpResponse != null) {
					httpResponse.close();
				}
			} catch (IOException e) {
				logger.info("## release resouce error ##" + e);
			}
		}
		return result;
	}

Java对接外部API这个问题

有一个小学妹来问我可以将我其他项目的api接入到我现在的项目中吗?我回答“可以”!

需求提出

那么拿到一个需求首先话不多说先分析这个需求的整体思路!需求上面大概有介绍,这里我更深入化的说明一下。

对接外部api接口就是说我在A项目写了一个接口时我的B项目需要到A这个接口的数据,那么在A项目上线的基础上使用B项目去调用A项目的这个所需的接口,如下图:

其实对接外部api就是这么一个过程,当然我们拿到外部数据后面的操作都是由自己去自由发挥了,比如将读取到的数据来显示在这个项目中去给前端显示。或者存入数据库等等。

解决思路

上面已经理解了调用的的思路,有了思路就好解决,现在很多的外部api接口可以给开发时带来便利,当然,调用的方式可能也会有稍些不同,比如手机号查询归属地、邮箱等等。

像这种的一般都是有官方文档可以给我们,很方便。

但是我们去调用自己的api又不是在一个项目中的那就要想想怎么实现了。

话不多说我就拿我之前写了一个DEMO中的数据吧,刚好项目还在线上。

编码

package edu.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.HttpMethod;
import edu.entity.EventVo;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author Fujii
 * @Date 2021-10-11 23:12
 * @Version SpringBoot 2.2.2
 * @projectName 调用外部api接口
 */
@RestController
public class BackEndApiDemo {

    @GetMapping("apiList")
    public Map<String,Object> getByApiList(){
        //这里先创建一个map用于返回api格式
        Map<String,Object> mapList = new HashMap<>();
        //1.我们是要去调用外部api,那么肯定要有一个外部api的地址,这里我是拿我的DEMO作为数据传输
        String apiURL = "这里直接放入你的api接口即可,我的api就不展示了,请谅解!";
        //2.这里有几种方式,你们去试了过后会发现不只有GET,这里因为我们是去获取数据,所以是用GET
        HttpMethod method = HttpMethod.GET;
        //用于接口返回的JSONObject()
        LinkedMultiValueMap map = new LinkedMultiValueMap();
        //json接收数据
        JSONObject  urlMethod = client(apiURL,method,map);
        JSONObject jsonObject = JSONObject.parseObject(urlMethod.toJSONString());
        JSONArray object = JSONObject.parseArray(jsonObject.get("data").toString());
        if (jsonObject!=null){
            List<EventVo> list = JSONArray.parseArray(object.toJSONString(), EventVo.class);
            mapList.put("list",list);
            mapList.put("code",200);
            mapList.put("msg", "获取成功!");

        }else{
            mapList.put("code",500);
            mapList.put("msg", "获取失败!");
            return mapList;
        }
        return mapList;
    }
    
    //注意:因为是测试,所有我所有内容全部写在一个文件内方便展示清晰,正规写法应写在服务层
    private JSONObject client(String url, HttpMethod method, LinkedMultiValueMap params) {
        RestTemplate template = new RestTemplate();
        ResponseEntity<JSONObject> response = template.getForEntity(url, JSONObject.class);
        return response.getBody();
    }
}

测试

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot3如何集成Hazelcast

    SpringBoot3如何集成Hazelcast

    Hazelcast是一款优秀的开源内存数据网格平台,它能够提供分布式数据存储和缓存解决方案,通过与SpringBoot3的整合,开发者可以轻松实现分布式缓存、数据共享和会话管理等功能,Hazelcast的内存数据网格特性支持高性能的缓存系统,能够减少数据库访问次数,提升应用性能
    2024-10-10
  • Java实现登录和注册案例

    Java实现登录和注册案例

    这篇文章主要为大家详细介绍了Java实现登录和注册案例,把用户信息存进集合,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java中URL的处理方法详解

    Java中URL的处理方法详解

    URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址,表示为互联网上的资源,本文主要为大家介绍了Java是如何处理URL的,感兴趣的可以了解一下
    2023-05-05
  • Spring Boot集成Druid查看配置是否生效的方法

    Spring Boot集成Druid查看配置是否生效的方法

    本文主要介绍了Spring Boot集成Druid查看配置是否生效的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Spring的Aware接口你知道多少

    Spring的Aware接口你知道多少

    这篇文章主要为大家详细介绍了Spring的Aware接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • java实现高效的枚举元素集合示例

    java实现高效的枚举元素集合示例

    Set是Java集合类的重要组成部分,它用来存储不能重复的对象。枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。然而枚举类型中的元素不能随意的增加、删除,作为集合而言,枚举类型非常不实用。EnumSet是专门为enum实现的集合类,本实例将演示其用法
    2014-03-03
  • Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解

    Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解

    这篇文章主要介绍了Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解,跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器施加的安全限制,所谓同源是指,域名,协议,端口均相同,需要的朋友可以参考下
    2023-12-12
  • springboot实现学生管理系统

    springboot实现学生管理系统

    这篇文章主要为大家详细介绍了springboot实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Java加密解密和数字签名完整代码示例

    Java加密解密和数字签名完整代码示例

    这篇文章主要介绍了Java加密解密和数字签名完整代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-12-12
  • 详解Jackson的基本用法

    详解Jackson的基本用法

    Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较低级,使用本文介绍的Jackson等高级类库处理起来会方便很多
    2021-06-06

最新评论