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(); } }
测试
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论