在工作中不可避免的要去调用第三方的接口去获得和使用相应的数据,请求的方式也有很多,包括post,get,put等等,不过最为常见的就是post和get两种方式了,下面我就简单的进行一下总结。
1.get请求无参数
@Override
public BaseResponse queryAirSearchList() {
if(search==null||search.equals("")){
String gm = PropertiesUtil.getInstance().getProperty("rh.airsearch");
HttpClient client = new HttpClient();
try {
GetMethod getMethod = new GetMethod(gm);
getMethod.setRequestHeader("Authorization",TaskDDToken.DDTOKEN);
logger.info("第三方接口开始调用");
client.executeMethod(getMethod);
String info = new String(getMethod.getResponseBody(),"UTF-8");
JSONObject responseJson = JSON.parseObject(info);
JSONObject datas = (JSONObject) responseJson.get("data");//拿到key
String code = responseJson.getString("code");
logger.info("第三方接口调用完成");
//判断code是不是10001
if(code.equals("10001")){
TaskDDToken.genToken();
}else{
}
//将获取到的数据放到search里面
search = datas;
System.out.println(info);
logger.info("航线搜索成功{}", info);
System.out.println(search.toJSONString());
return new BaseResponse("0000", "航线搜索成功",search);
} catch (Exception e) {
logger.error("调用失败");
e.printStackTrace();
return new BaseResponse("9999", "航线搜索失败");
}
}else{
return}
这个是一个get请求的无参数的一个示例。在这里我把我的思路解释一下。首先要有一个HttpClient请求,其次定义出你请求第三方接口的路径,接下来就利用get请求的方式进行组装,组装完成后client进行调用。不管调用是否成功,都要接收返回回来的参数,最常见的就是json格式的数据,我现在也没有碰到其他类型的数据。将接受到的返回参数进行解析,最后打印。成功的话一般返回的是200或者0000.由于我这边没有正在运行demo,大家就只能凑合着脑补啦。大致就是这么一个样子。
2.get请求有参数(一个或者多个)
@Override
public BaseResponse queryAirSearchList(String departure, String arrive, String departure_at, String category,
String return_at) {
if(search==null||search.equals("")){
//System.out.println(departure+arrive+departure_at+category+return_at);
String gm = PropertiesUtil.getInstance().getProperty("rh.airsearch");
//String gms = gm+"?departure="+departure+"&arrive="+arrive+"&departure_at="+departure_at+"&category="+category+"&return_at="+return_at;
//System.out.println(gms);
HttpClient client = new HttpClient();
List<NameValuePair> params = Lists.newArrayList();
params.add(new BasicNameValuePair("departure",departure));
params.add(new BasicNameValuePair("arrive",arrive));
params.add(new BasicNameValuePair("departure_at",departure_at));
params.add(new BasicNameValuePair("category",category));
params.add(new BasicNameValuePair("return_at",return_at));
String str= null;
try {
str = EntityUtils.toString(new UrlEncodedFormEntity(params, Consts.UTF_8));
GetMethod getMethod = new GetMethod(gm+"?"+str);
getMethod.setRequestHeader("Authorization",TaskDDToken.DDTOKEN);
logger.info("第三方接口开始调用");
client.executeMethod(getMethod);
String info = new String(getMethod.getResponseBody(),"UTF-8");
JSONObject responseJson = JSON.parseObject(info);
JSONObject datas = (JSONObject) responseJson.get("data");//拿到key
String code = responseJson.getString("code");
logger.info("第三方接口调用完成");
//判断code是不是10001
if(code.equals("10001")){
TaskDDToken.genToken();
}else{
}
//将获取到的数据放到search里面
search = datas;
System.out.println(info);
logger.info("航线搜索成功{}", info);
System.out.println(search.toJSONString());
return new BaseResponse("0000", "航线搜索成功",search);
} catch (Exception e) {
logger.error("调用失败");
e.printStackTrace();
return new BaseResponse("9999", "航线搜索失败");
}
}else{
return
这个是我在get无参上面修改的一个请求。
这里需要注意的是参数的组装,一个是前台传给你,你这边后台负责接收,一个是你这边demo测试的时候自己给定它相应的值。
前台传值大致可以这样,自己新建一个dto或者entity,将所传参数的字段写进去,后台接收相应的dto即可。
后台给定相应的值,可以自己写一个map,将相应的请求参数临时传到请求中。
在这里我就是用前台请求的方式进行组装参数,待会在post请求中我会利用map进行临时参数保存。
3.post请求带参数
Map<String,String> params = new HashMap<String, String>();
params.put("accountId","8451252");
params.put("name","8888");
params.put("cardNo","999999");
params.put("orderId","8888888");
params.put("purpose","还款");
params.put("amount","0.01");
params.put("responseUrl","http://IP:PORT");
params.put("key","123456abc");
String paymentStr = getPaymentStr(params);
System.out.println(paymentStr);
String mac = BankMD5Utils.MD5(paymentStr);
System.out.println(mac);
params.put("mac",mac);
HttpClient httpclient = new HttpClient();
PostMethod post = new PostMethod("http://182.251.210.21:4545/delegate-pay-front-dp/delegatePay/pay");
post.setRequestHeader("Accept", "application/json");
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
post.addParameter("accountId", params.get("accountId"));
post.addParameter("name", params.get("name"));
post.addParameter("cardNo", params.get("cardNo"));
post.addParameter("orderId", params.get("orderId"));
post.addParameter("purpose", params.get("purpose"));
post.addParameter("amount", params.get("amount"));
post.addParameter("responseUrl", params.get("responseUrl"));
post.addParameter("mac", params.get("mac"));
try {
httpclient.executeMethod(post);
String info = new String(post.getResponseBody(), "utf-8");
JSONObject responseJson = JSON.parseObject(info);
System.out.println(info);
System.out.println("resp"+responseJson);
} catch (IOException e) {
e.printStackTrace();
}
由于有了get请求的相关示例,这里我就直接把post请求进行一个合并。这里我采用的是map进行存值操作,并且根据要求对其中的值进行加密,对于加密我在最后会提及。最后new出一个post请求,将这些参数组装进去,最后接收返回的值进行打印。大致和get请求差不多,不过post是隐式传参,get是显示传参。
4.加密方式
目前我所接触到的主要有四种:CA证书,Token,MD5,MD5+盐
CA证书的话需要自己公司这边协商CA那边,然后通过颁发相应的证书以及其他加密规则进行加密。
Token的话,大致来说即使客户端请求服务端,服务端会颁发一个token,客户端拿到后会请求服务端将token进行比对,从而校验通过。
MD5:这个可以说是加密界的元老了,网上也有很多的加密规则,包括16位和32位的加密规则。还有大小写转换等等。比如上面的post请求就是用用md5加密规则生成32位的小写加密密文。很不幸加密代码丢掉了,不过网上还是可以找的到的,大家可以研究一下。
最后一种只是在项目中惊鸿一bie,就不到这里说了。
总结一下吧,其实像我这样写的接口请求还是有很多问题的,比如没有经过验证,验证字段的合理性和相应规则,返回参数的解析打印和log日志的输出,所以呀,还是有很多需要学习的地方,大家一起加油吧。。。