Java如何调用接口API并返回数据(两种方法) 您所在的位置:网站首页 java接口开发需要注意什么 Java如何调用接口API并返回数据(两种方法)

Java如何调用接口API并返回数据(两种方法)

2023-03-24 01:59| 来源: 网络整理| 查看: 265

java处理请求接口后返回的json数据-直接处理json字符串

处理思路:

将返回的数据接收到一个String对象中(有时候需要自己选择性的取舍接收)再将string转换为JSONObject对象用get()方法获取到对应的值

注意:基于第三点的特殊情况,如果返回的json里面出现多组数据的情况,则需要转换为数据(用JSONObject.parseArrat()转换再进行操作 ,可无限套娃)

调用接口,请求数据

1.post方法

package com.zc.zcdj.utils; import com.alibaba.fastjson.JSONObject; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.clienthods.CloseableHttpResponse; import org.apache.http.clienthods.HttpGet; import org.apache.http.clienthods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; import java.net.URI; import java.util.*; public static JSONObject postResponse(String url,JSONObject jsonParam){ HttpClient client = HttpClients.createDefault(); // 要调用的接口方法 HttpPost post = new HttpPost(url); JSONObject jsonObject = null; try { StringEntity s = new StringEntity(jsonParam.toString(),"UTF-8"); s.setContentType("application/json"); post.setEntity(s); post.setHeader("Content-Type","application/json"); HttpResponse res = client.execute(post); if(res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ /*返回json格式*/ jsonObject = JSONObject.parseObject(EntityUtils.toString(res.getEntity())); } } catch (IOException e) { System.out.println("接口调用出错!"); e.printStackTrace(); throw new RuntimeException(e); } return jsonObject; }

2.get方法

import com.alibaba.fastjson.JSONObject; import edu.zhku.fire_ant_project.config.WxConstant; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.clienthods.HttpGet; import org.apache.http.clienthods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class HttpCallOtherInterfaceUtils { public static void main(String args[]) { HttpClient client = HttpClients.createDefault(); // 要调用的接口方法 String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ WxConstant.appid +"&secret="+WxConstant.secret; HttpGet httpGet=new HttpGet(url); JSONObject jsonObject = null; try { HttpResponse res = client.execute(httpGet); if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 返回json格式: jsonObject = JSONObject.parseObject(EntityUtils.toString(res.getEntity())); System.out.println(jsonObject); } } catch (Exception e) { System.out.println("服务间接口调用出错!"); e.printStackTrace(); } } } 处理返回后的json数据

参考代码:

package com.az; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class JsonStr { public static void main(String[] args) { //1.比如从前端接收的是这个样子的json字符串,但是我们是不能直接获取到经度 纬度所对应的值的,所以必须要对这个字符串进行解析, String str = "{\"code\":\"0\"," + "\"error\":null," + "\"msg\":\"success\"," + "\"detail\":[\n" + " {\"phoneNum\":\"013012401091\",\n" + " \"lat\":34.431864,\n" + " \"lon\":109.25992,\n" + " \"height\":360,\n" + " \"speed\":33,\n" + " \"direction\":10,\n" + " \"gpsTime\":1615420800000,\n" + " \"gpsDateTime\":1615420800000,\n" + " \"mileage\":253830800,\n" + " \"alarms\":[24],\n" + " \"status\":[1,2,21],\n" + " \"property\":{}\n" + " }" + " ]" + " }"; //先转换成JSONObject类型 JSONObject jsonObj = JSON.parseObject(str); //通过JSONObject中的getString("key")方法,得到对应的值 {"code":"0","error":null,"msg":"success"}这种类型 System.out.println("code:"+jsonObj.getString("code")); //2.字符串中含有数组的,比如像detail中的数据 JSONArray jsonInfo = JSONObject.parseArray(jsonObj.getString("detail"));//将jsonObj解析成json数组 for (int i = 0; i s.get统一商品编码() != null).filter(s -> s.get规则() != null).collect(Collectors.toMap(s -> s.get规则(), s -> s.get统一商品编码())); log.info("第一次请求珍诚接口..."); // 请求第一次获取数据总条数 以及分页后循环次数 Map response = HttpClientUtil.getOneRequest(); Integer pages = (Integer) response.get("pages");// Integer total = (Integer) response.get("total"); Integer pageNum = (Integer) response.get("pageNum");//当前页数 // Boolean isLastPage = (Boolean) response.get("isLastPage"); // JSONObject data = (JSONObject) response.get("data"); log.info("获取珍诚商品列表全量数据共有" + total + "条,共有" + pages + "页数据"); log.info("珍诚全量开始执行..."); for (int i = 1; i

关于Java对json字符串的处理,可以直接获取;但当使用频率较多的时候,就不太方便了。既然是面向对象编程,那就向json的数据转化为对象!

处理思路:

需要根据接收到的json对象构建对象。将所有需要的数据全部封装为对象!再利用阿里(fastjson)/google(Gson)的json转对象的方法直接转为对象,再直接操作对象

假设以下是我们接收到的json,我们需要的是detail中的数据;

则需要构建实体dataItems以及包含dataItems的实体

然后直接进行转换:

示例代码:实体(假设都是String类型)

dataItems

public class DataIteams { private String phoneNum; private String aramDateTime; private String aramType; private String lon; private String lat; private String devNo; private String descripton; private String since; private String amc; @Override public String toString() { return "DataIteams{" + "phoneNum='" + phoneNum + '\'' + ", aramDateTime='" + aramDateTime + '\'' + ", aramType='" + aramType + '\'' + ", lon='" + lon + '\'' + ", lat='" + lat + '\'' + ", devNo='" + devNo + '\'' + ", descripton='" + descripton + '\'' + ", since='" + since + '\'' + ", amc='" + amc + '\'' + '}'; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } public String getAramDateTime() { return aramDateTime; } public void setAramDateTime(String aramDateTime) { this.aramDateTime = aramDateTime; } public String getAramType() { return aramType; } public void setAramType(String aramType) { this.aramType = aramType; } public String getLon() { return lon; } public void setLon(String lon) { this.lon = lon; } public String getLat() { return lat; } public void setLat(String lat) { this.lat = lat; } public String getDevNo() { return devNo; } public void setDevNo(String devNo) { this.devNo = devNo; } public String getDescripton() { return descripton; } public void setDescripton(String descripton) { this.descripton = descripton; } public String getSince() { return since; } public void setSince(String since) { this.since = since; } public String getAmc() { return amc; } public void setAmc(String amc) { this.amc = amc; } }

detail的实体

import java.util.List; public class Detail { private String pageCount; private String totalCount; private String pageIndex; private String pageSize; /** *这个实体就是DataItems里面的数据体 */ private List dataItems; @Override public String toString() { return "Detail{" + "pageCount='" + pageCount + '\'' + ", totalCount='" + totalCount + '\'' + ", pageIndex='" + pageIndex + '\'' + ", pageSize='" + pageSize + '\'' + ", dataItems=" + dataItems + '}'; } public String getPageCount() { return pageCount; } public void setPageCount(String pageCount) { this.pageCount = pageCount; } public String getTotalCount() { return totalCount; } public void setTotalCount(String totalCount) { this.totalCount = totalCount; } public String getPageIndex() { return pageIndex; } public void setPageIndex(String pageIndex) { this.pageIndex = pageIndex; } public String getPageSize() { return pageSize; } public void setPageSize(String pageSize) { this.pageSize = pageSize; } public List getDataItems() { return dataItems; } public void setDataItems(List dataItems) { this.dataItems = dataItems; } }

当构建了实体以后就可以利用方法转换了!

示例代码:

import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.util.HashMap; public class Main { public static void main(String[] args) { String str = "{\n" + " \"code\": \"0\",\n" + " \"error\": \"\",\n" + " \"msg\": \"success\",\n" + " \"detail\": {\n" + " \"pageCount\": 1,\n" + " \"totalCount\": 9,\n" + " \"pageIndex\": 1,\n" + " \"pageSize\": 1000,\n" + " \"dataItems\": [\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1616990185000,\n" + " \"aramType\": 1,\n" + " \"lon\": 114.224438,\n" + " \"lat\": 30.55706,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1616990186000,\n" + " \"aramType\": 1,\n" + " \"lon\": 114.224457,\n" + " \"lat\": 30.557187,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1616990190000,\n" + " \"aramType\": 1,\n" + " \"lon\": 114.224484,\n" + " \"lat\": 30.557565,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1616990195000,\n" + " \"aramType\": 1,\n" + " \"lon\": 114.224434,\n" + " \"lat\": 30.557971,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1616990196000,\n" + " \"aramType\": 1,\n" + " \"lon\": 114.224388,\n" + " \"lat\": 30.558073,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1616990200000,\n" + " \"aramType\": 1,\n" + " \"lon\": 114.224297,\n" + " \"lat\": 30.558436,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1614736039000,\n" + " \"aramType\": 27,\n" + " \"lon\": 114.204813,\n" + " \"lat\": 30.553443,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1615342530000,\n" + " \"aramType\": 27,\n" + " \"lon\": 114.216378,\n" + " \"lat\": 30.561051,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " },\n" + " {\n" + " \"phoneNum\": \"027044039989\",\n" + " \"aramDateTime\": 1616990178000,\n" + " \"aramType\": 27,\n" + " \"lon\": 114.222609,\n" + " \"lat\": 30.554516,\n" + " \"devNo\": \"\",\n" + " \"descripton\": \"\",\n" + " \"since\": \"\",\n" + " \"amc\": \"\"\n" + " }\n" + " ]\n" + " },\n" + "}"; //先转换成JSONObject类型 String json = JSON.parseObject(str).getString("detail"); Detail detail = JSONObject.parseObject(json, Detail.class); System.out.println(detail); } }

运行的结果:

获得的对象就可以直接使用get和set方法获取数据了

方法:

//Javabean对象转换成String类型的JSON字符串 JSONObject.toJSONString(Javabean对象) //String类型的JSON字符串转换成Javabean对象 JSONObject.toJavaObject(JSON字符串,Javabean.class) //Json字符串转换成JSONObject对象 JSONObject.parseObject(JSON字符串) //JSON字符串转换成Javabean对象 JSONObject.parseObject(JSON字符串,Javabean.class)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有