快递100接⼝调⽤代码实例-Java
前⾔
我的第⼀篇博客,因为在⽹上没有搜索到⾃⼰满意的结果,⾃⼰总结下吧
1.申请快递100的API
2.申请成功后
申请成功后快递100会给我们两个参数,作为调⽤接⼝时传参以及校验⽤的,⼀个是customer编码,另⼀个是授权的 key 编码。接下来我解释下请求中的参数:
expressCategory : 快递单号所对应的快递公司的编码,⽐如 “yuantong”
number : 要查询的快递单号
customer : 快递100分配的客户编码
key:授权的 key
sign : 签名 param + key + customer,这⼏个必须有
* 调⽤快递100接⼝,查询物流信息
* @param number 要查询的快递单号
* @param expressCategory 快递单号所对应的快递公司的编码,⽐如 “yuantong”
* @return
*/
public List<Map<String,Object>>rightKuaidi100(String number, String expressCategory ){
//此处根据快递单号拿到对应的公司的编码,⽐如 “yuantong”,这部分代码我就不上了
//String expressCategory = ExpressCategory(number);
String param ="{"com":"" + expressCategory + "","num":"" + number + "","from":"","to":""}";
String customer ="88C6CA**************B65AE2FO1";
String key ="rt*******66";
String sign =signMD5(param + key + customer);
HashMap params =new HashMap();
params.put("param", param);
params.put("sign", UpperCase());
//params.put("sign",sign);
params.put("customer", customer);
String responseString = HttpUtils.okHttpPostString("poll.kuaidi100/poll/query.do", params);
//格式化返回参数信息
Map<String, Object> map1 =(Map<String, Object>) JSONObject.parse(responseString);
return datas =(List<Map<String,Object>>)("data");
}
/
**
* 快递100 签名
* @param s
* @return
*/
public static String signMD5(String s){
try{
MessageDigest md = Instance("MD5");
byte[] bytes = md.Bytes("utf-8"));
return bytesToHex(bytes);
}catch(Exception var3){
throw new RuntimeException(var3);
}
}
public static String bytesToHex(byte[] bytes){
char[] HEX_DIGITS ="0123456789abcdef".toCharArray();
StringBuilder ret =new StringBuilder(bytes.length *2);
for(int i =0; i < bytes.length;++i){
ret.append(HEX_DIGITS[bytes[i]>>4&15]);
ret.append(HEX_DIGITS[bytes[i]&15]);
}
String();
查快递物流到哪了}
Http请求部分代码
* okHttp3的 POST 请求 , 请求参数格式为 key-value
* @param url 请求url
* @param params 请求参数 , Map
* @return
* @author zfan
* @email zfanxyz@gmail
*/
public static String okHttpPostString(String url, Map<String, Object> params){
List<NameValuePair> paramList =new ArrayList<NameValuePair>();
Collection<String> keyset = params.keySet();
List<String> keylist =new ArrayList<String>(keyset);
Collections.sort(keylist);
for(int i =0; i < keylist.size(); i++){
(i)!= null &&!"".((i)))){
paramList.add(new (i), ((i)).toString()));
}
}
//请求参数
String requestString = URLEncodedUtils.format(paramList, Charset.forName("UTF-8"));
//创建⼀个默认的OkHttpClient实例:
OkHttpClient client =new OkHttpClient.Builder()
.readTimeout(100, TimeUnit.SECONDS)//设置读取的超时时间 s
.writeTimeout(60, TimeUnit.SECONDS)//设置写的超时时间 s
.connectTimeout(60, TimeUnit.SECONDS)//设置连接的超时时间 s
.build();
//post 的 key-value 形式的请求参数的格式
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");//数据类型为 key-value 格式//创建⼀个实体 RequestBody
RequestBody requestBody = ate(mediaType, requestString);
Request request =new Request.Builder()
.url(url)
.post(requestBody)
.build();
try{
Response response = wCall(request).execute();
if(response.isSuccessful()){
return  response.body().string();
}else{
throw new IOException("Unexpected code : "+ response);
}
}catch(IOException e){
e.printStackTrace();
}
return"";
}
应该没啥漏掉的吧,欢迎指正
那个kuaidi100最后返回的参数,我对请求的响应参数做了处理,仅仅取出了data中的数据。
data的数据格式如下,如果想要全部的,可以打印下⽇志,按照格式取出想要的数据。
"data":[
{
"ftime":"2019-04-04 08:17:57",
"context":"【**市】已签收 : 由已签收(***1号 )代签收,如有问题联系***(133********)",
"time":"2019-04-04 08:17:57"
},
{
"ftime":"2019-04-02 04:04:35",
"context":"【深圳市】已到达⼴东深圳公司⼤包称重",
"time":"2019-04-02 04:04:35"
},
{
"ftime":"2019-04-01 22:18:27",
"context":"【深圳市】 ************包分部已揽收",
"time":"2019-04-01 22:18:27"
}
]
好了,⾄此调⽤快递100接⼝的数据到此完毕了,当然要向快递100官⽅申请的。欢迎⼤家指正,后续把通过快递单号拿到对应的快递公司编码的代码补充上