Java调用第三方接口,实战来了
在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。1、准备工作:
在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面有调用接口的方法【分为Get和Post方式的有参和无参调用】:packagecom。njsc。credit。util;importjava。io。IOException;importjava。net。URI;importjava。util。ArrayList;importjava。util。List;importjava。util。Map;importorg。apache。http。NameValuePair;importorg。apache。http。client。entity。UrlEncodedFormEntity;importorg。apache。http。client。methods。CloseableHttpResponse;importorg。apache。http。client。methods。HttpGet;importorg。apache。http。client。methods。HttpPost;importorg。apache。http。client。utils。URIBuilder;importorg。apache。http。entity。ContentType;importorg。apache。http。entity。StringEntity;importorg。apache。http。impl。client。CloseableHttpClient;importorg。apache。http。impl。client。HttpClients;importorg。apache。http。message。BasicNameValuePair;importorg。apache。http。util。EntityUtils;publicclassHttpClientUtil{带参数的get请求paramurlparamparamreturnStringpublicstaticStringdoGet(Stringurl,MapString,Stringparam){创建Httpclient对象CloseableHttpClienthttpclientHttpClients。createDefault();StringresultString;CloseableHttpResponseresponsenull;try{创建uriURIBuilderbuildernewURIBuilder(url);if(param!null){for(Stringkey:param。keySet()){builder。addParameter(key,param。get(key));}}URIuribuilder。build();创建httpGET请求HttpGethttpGetnewHttpGet(uri);执行请求responsehttpclient。execute(httpGet);判断返回状态是否为200if(response。getStatusLine()。getStatusCode()200){resultStringEntityUtils。toString(response。getEntity(),UTF8);}}catch(Exceptione){e。printStackTrace();}finally{try{if(response!null){response。close();}httpclient。close();}catch(IOExceptione){e。printStackTrace();}}returnresultString;}不带参数的get请求paramurlreturnStringpublicstaticStringdoGet(Stringurl){returndoGet(url,null);}带参数的post请求paramurlparamparamreturnStringpublicstaticStringdoPost(Stringurl,MapString,Stringparam){创建Httpclient对象CloseableHttpClienthttpClientHttpClients。createDefault();CloseableHttpResponseresponsenull;StringresultString;try{创建HttpPost请求HttpPosthttpPostnewHttpPost(url);创建参数列表if(param!null){ListNameValuePairparamListnewArrayList();for(Stringkey:param。keySet()){paramList。add(newBasicNameValuePair(key,param。get(key)));}模拟表单UrlEncodedFormEntityentitynewUrlEncodedFormEntity(paramList);httpPost。setEntity(entity);}执行http请求responsehttpClient。execute(httpPost);resultStringEntityUtils。toString(response。getEntity(),utf8);}catch(Exceptione){e。printStackTrace();}finally{try{response。close();}catch(IOExceptione){e。printStackTrace();}}returnresultString;}不带参数的post请求paramurlreturnStringpublicstaticStringdoPost(Stringurl){returndoPost(url,null);}传送json类型的post请求paramurlparamjsonreturnStringpublicstaticStringdoPostJson(Stringurl,Stringjson){创建Httpclient对象CloseableHttpClienthttpClientHttpClients。createDefault();CloseableHttpResponseresponsenull;StringresultString;try{创建HttpPost请求HttpPosthttpPostnewHttpPost(url);创建请求内容StringEntityentitynewStringEntity(json,ContentType。APPLICATIONJSON);httpPost。setEntity(entity);执行http请求responsehttpClient。execute(httpPost);resultStringEntityUtils。toString(response。getEntity(),utf8);}catch(Exceptione){e。printStackTrace();}finally{try{response。close();}catch(IOExceptione){e。printStackTrace();}}returnresultString;}}2、创建url和访问key以及参数等:
代码如下:聚合接口校验身份证paramidCardparamrealNamereturnbooleanpublicbooleanidentityCheck(StringidCard,StringrealName){logger。info(调用聚合数据身份证验证APIBEGIN);StringkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;Stringurlhttp:op。juhe。cnidcardquery?keykeyidcardidCardrealnamerealName;logger。info(请求url:url);booleanmatchfalse;是否匹配try{StringresultHttpClientUtil。doGet(url);System。out。println(请求结果:result);IdentityCheckResultidentityCheckResultJsonUtils。parse(result,IdentityCheckResult。class);IdentityCheckidentityCheckJsonUtils。parse(result,result,IdentityCheck。class);logger。info(identityCheckResult);logger。info(identityCheck。toString());if(identityCheckResult。correct()identityCheck。getRes()1){matchtrue;}}catch(Exceptione){e。printStackTrace();}logger。info(调用聚合数据身份证验证APIEND);returnmatch;}3、请求这个第三方接口:
使用HttpClientUtil工具类中的doGet方法来请求URL,得到结果,现在大多数是一个json字符串,类型为String。4、根据接口返回数据格式来解析数据:
可以看到,返回参数有六个,最新Java面试题分享你看下,所以在项目中新建一个bean,包含以上六个字段,用来接住返回数据,如下:
因为接口返回的数据是一个json的字符串,类型实际上是一个String字符串,要解析数据,用工具类JsonUtils的parse方法将字符串转换为Java对象,JsonUtils的代码如下:packagecom。eqianxian。commons。utils。json;importjava。util。List;importjava。util。Map;importcom。alibaba。fastjson。JSON;importcom。alibaba。fastjson。JSONObject;importcom。alibaba。fastjson。serializer。PropertyFilter;importcom。alibaba。fastjson。serializer。SerializerFeature;在系统中统一使用这个,以方便将来切换不同的JSON生成工具authorKelvinZpublicclassJsonUtils{publicstaticfinalintTYPEFASTJSON0;publicstaticfinalintTYPEGSON1;pre对象转化为json字符串paramobj待转化对象return代表该对象的Json字符串publicstaticfinalStringtoJson(finalObjectobj){returnJSON。toJSONString(obj);returngson。toJson(obj);}pre对象转化为json字符串paramobj待转化对象return代表该对象的Json字符串publicstaticfinalStringtoJson(finalObjectobj,SerializerFeature。。。features){returnJSON。toJSONString(obj,features);returngson。toJson(obj);}对象转化为json字符串并格式化paramobjparamformat是否要格式化returnpublicstaticfinalStringtoJson(finalObjectobj,finalbooleanformat){returnJSON。toJSONString(obj,format);}对象对指定字段进行过滤处理,生成json字符串paramobjparamfields过滤处理字段paramignoretrue做忽略处理,false做包含处理paramfeaturesjson特征,为null忽略returnpublicstaticfinalStringtoJson(finalObjectobj,finalString〔〕fields,finalbooleanignore,SerializerFeature。。。features){if(fieldsnullfields。length1){returntoJson(obj);}if(featuresnull)featuresnewSerializerFeature〔〕{SerializerFeature。QuoteFieldNames};returnJSON。toJSONString(obj,newPropertyFilter(){Overridepublicbooleanapply(Objectobject,Stringname,Objectvalue){for(inti0;ifields。length;i){if(name。equals(fields〔i〕)){return!ignore;}}returnignore;}},features);}pre解析json字符串中某路径的值paramjsonparampathreturnSuppressWarnings(unchecked)publicstaticfinalEEparse(finalStringjson,finalStringpath){String〔〕keyspath。split(,);JSONObjectobjJSON。parseObject(json);for(inti0;ikeys。length1;i){objobj。getJSONObject(keys〔i〕);}return(E)obj。get(keys〔keys。length1〕);}prejson字符串解析为对象paramjson代表一个对象的Json字符串paramclazz指定目标对象的类型,即返回对象的类型return从json字符串解析出来的对象publicstaticfinalTTparse(finalStringjson,finalClassTclazz){returnJSON。parseObject(json,clazz);}prejson字符串解析为对象paramjsonjson字符串parampath逗号分隔的json层次结构paramclazz目标类publicstaticfinalTTparse(finalStringjson,finalStringpath,finalClassTclazz){String〔〕keyspath。split(,);JSONObjectobjJSON。parseObject(json);for(inti0;ikeys。length1;i){objobj。getJSONObject(keys〔i〕);}Stringinnerobj。getString(keys〔keys。length1〕);returnparse(inner,clazz);}将制定的对象经过字段过滤处理后,解析成为json集合paramobjparamfieldsparamignoreparamclazzparamfeaturesreturnpublicstaticfinalTListTparseArray(finalObjectobj,finalString〔〕fields,booleanignore,finalClassTclazz,finalSerializerFeature。。。features){StringjsontoJson(obj,fields,ignore,features);returnparseArray(json,clazz);}pre从json字符串中解析出一个对象的集合,被解析字符串要求是合法的集合类型(形如:〔k1:v1,k2:v2,。。。kn:vn〕)paramjson〔keyvaluepair。。。〕paramclazzreturnpublicstaticfinalTListTparseArray(finalStringjson,finalClassTclazz){returnJSON。parseArray(json,clazz);}pre从json字符串中按照路径寻找,并解析出一个对象的集合,例如:类Person有一个属性name,要从以下json中解析出其集合:{pageinfo:{items:{item:〔{name:KelvinZ},{name:Jobs},。。。{name:Gates}〕}}使用方法:parseArray(json,pageinfo,items,item,Person。class),将根据指定路径,正确的解析出所需集合,排除外层干扰paramjsonjson字符串parampath逗号分隔的json层次结构paramclazz目标类returnpublicstaticfinalTListTparseArray(finalStringjson,finalStringpath,finalClassTclazz){String〔〕keyspath。split(,);JSONObjectobjJSON。parseObject(json);for(inti0;ikeys。length1;i){objobj。getJSONObject(keys〔i〕);}Stringinnerobj。getString(keys〔keys。length1〕);ListTretparseArray(inner,clazz);returnret;}pre有些json的常见格式错误这里可以处理,以便给后续的方法处理常见错误:使用了或者{或者},腾讯的页面中常见这种格式paraminvalidJson包含非法格式的json字符串returnpublicstaticfinalStringcorrectJson(finalStringinvalidJson){StringcontentinvalidJson。replace(,)。replace({,{)。replace(},});returncontent;}格式化JsonparamjsonreturnpublicstaticfinalStringformatJson(Stringjson){Maplt;?,?map(Maplt;?,?)JSON。parse(json);returnJSON。toJSONString(map,true);}获取json串中的子jsonparamjsonparampathreturnpublicstaticfinalStringgetSubJson(Stringjson,Stringpath){String〔〕keyspath。split(,);JSONObjectobjJSON。parseObject(json);for(inti0;ikeys。length1;i){objobj。getJSONObject(keys〔i〕);System。out。println(obj。toJSONString());}returnobj!null?obj。getString(keys〔keys。length1〕):null;}}