免费资源网,https://freexyz.cn/
目录
  • Java调用外部Api
    • 1.含有文件的post请求
    • 2.单纯的Json
    • 3.String参数
  • 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项目的这个所需的接口,如下图:

    Java如何实现调用外部Api

    其实对接外部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();
        }
    }
    

    测试

    Java如何实现调用外部Api

    总结

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

    免费资源网,https://freexyz.cn/
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。