基于网页api(接口)实现查快递
之前在网上找到一款下载某慕课网站的java版软件,我想知道他是怎么实现:对于视频的下载的,毕竟网页源码中大都不会直接放视频的地址,但是没有公布源码,我就反编译,等到了部分“源码”,逻辑上还是有些问题,所以还要自己修改一下。最终代码还是能和原程序一样跑,但是部分代码无法理解,他是怎么实现的,或者说他是怎么得到的。
jsonDoc=Jsoup.connect("http://www.imooc.com/course/ajaxmediainfo/?mid=" + videoNo + "&mode=flash").timeout(10000).get();
代码展现的不多,重要的不是代码,重要的是我怎么解决了这个问题。周五忙碌了一下午,看网页源码,找getpost请求,都没看到相关的网址,直到周五晚上,跟老师反映了问题,得到了解答。终于是理解了,但疑惑还是没解决,原程序作者是怎么得到这个接口(网页api)的。

疑惑虽然没有解决,但我还是对这接口感兴趣,所以今天打算写一个关于查快递的程序。(ps:这样的功能网页、app上有的是,遭室友吐槽。)写这个程序的目的是感受一下接口是怎么样的,相比较直接重网页中爬取自己想要的信息有什么区别。
直入正题:
1、百度搜索免费的网页api,找到的不多,所以挑选了一个感觉相对有用的查快递的接口。

这是网址:http://www.bejson.com/knownjson/webInterface/
2、代码实现
需要json,jsoup第三方库的支持。下载地址:链接:http://pan.baidu.com/s/1slayVzZ 密码:pppe ,过期不补,网上有。
我认为这程序实现的关键在于对json的解析,之前学习爬虫涉及到一些。
对于接口返回的数据可以用正则表达式解决,但是我感觉用json更fashion一点。
首先jsoup建立链接得到返回值
Document jsondoc;
jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
String jsonData=jsondoc.text();
然后对返回数据的解析,json的数据结构由对象,数组,对象数组混合这么几种。可以通过http://www.bejson.com/整理数据,方便观察数据结构。
JSONObject jsonObject=new JSONObject(jsonData);
JSONArray data=jsonObject.getJSONArray("data"); System.out.println("查询结果:"+jsonObject.getString("message"));
if (jsonObject.getString("message").equals("ok")){
System.out.println("快递公司:"+jsonObject.getString("com"));
System.out.println("快递单号:"+jsonObject.getString("nu")); //具体信息
for (int i=data.length()-1;i>0;i--){
JSONObject object=data.getJSONObject(i);
System.out.print(object.getString("time"));
System.out.println(" "+object.getString("context"));
}
}
最后,时间关系,不详细讲解,直接上全部代码。
package com; import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.util.Scanner; public class Main { public static void main(String[] args) { Document jsondoc;
Scanner input=new Scanner(System.in);
boolean yesNo;
while (true) { yesNo=true;
System.out.println("快递公司编码:申通=\"st\" EMS=\"ems\" 顺丰=\"sf\" 圆通=\"yt\" 中通=\"zt\" 韵达=\"yd\" " +
"天天=\"tt\" 汇通=\"ht\" 全峰=\"qf\" 德邦=\"db\" 宅急送=\"zjs\"");
System.out.println("请输入快递公司编号和快递单号,中间用逗号或空格隔开,如(sf,123456789;sf,123456789;sf 123456789)");
try {
String string=input.nextLine();
int num=string.indexOf(',');
if (num==-1){
num=string.indexOf(',');
if (num==-1){
num=string.indexOf(' ');
}
} String CompanyNumber=string.substring(0,num);
String OrderNumber=string.substring(num+1); switch (CompanyNumber){
case "st":
CompanyNumber="shentong";
break;
case "ems":
break;
case "sf":
CompanyNumber="shunfeng";
break;
case "yt":
CompanyNumber="yuantong";
break;
case "zt":
CompanyNumber="zhongtong";
break;
case "yd":
CompanyNumber="yunda";
break;
case "tt":
CompanyNumber="tiantian";
break;
case "ht":
CompanyNumber="huitongkuaidi";
break;
case "qf":
CompanyNumber="quanfengkuaidi";
break;
case "db":
CompanyNumber="debangwuliu";
break;
case "zjs":
CompanyNumber="zhaijisong";
break;
default:
System.out.println("编号错误或暂不支持该快递公司的查询");
yesNo=false;
break;
} if (yesNo){ jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
String jsonData=jsondoc.text();
JSONObject jsonObject=new JSONObject(jsonData);
JSONArray data=jsonObject.getJSONArray("data"); System.out.println("查询结果:"+jsonObject.getString("message"));
if (jsonObject.getString("message").equals("ok")){
System.out.println("快递公司:"+jsonObject.getString("com"));
System.out.println("快递单号:"+jsonObject.getString("nu")); //具体信息
for (int i=data.length()-1;i>0;i--){
JSONObject object=data.getJSONObject(i);
System.out.print(object.getString("time"));
System.out.println(" "+object.getString("context"));
}
} } } catch (IOException e) {
e.printStackTrace();
} System.out.print("按回车键继续!");
input.nextLine();
}
}
}
运行结果展示:

本人刚接触java不久,语法结构不是很标准,严谨,希望大家谅解。如有问题可以相互交流。
谢谢阅读
基于网页api(接口)实现查快递的更多相关文章
- 基于Metaweblog API 接口一键发布到国内外主流博客平台
之前的生活 之前一直使用evenote写博客和日志,其实还是挺方便的.但是我一直都希望能够同步到国内的博客和国外的blogspot等主流博客平台.而强大everote只提供了facebook.twit ...
- APISpace 全球快递物流查询API接口 免费好用
前言 随着我国电子商务的迅猛发展,物流行业也开始突飞猛进,人们的日常生活越来越离不开快递服务,查快递.寄快递的需求越来越大,随之而来,常用快递接口的需求也越来越大. 全国快递查询接口,支持各大快递 ...
- Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
- Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
- 各种快递查询--Api接口
授权成功我的密钥 爱查快递API使用说明文档 API地址: 以前:http://api.ickd.cn/?com=[]&nu=[]&id=[]&type=[]&enco ...
- Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试【转】
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
- 微信小程序+OLAMI(欧拉蜜)自然语言API接口制作智能查询工具--快递、聊天、日历等
微信小程序最近比较热门,再加上自然语义理解也越来越被人关注,于是我想赶赶潮流,做一个小程序试试.想来想去快递查询应该是一种比较普遍的需求. 如果你也在通过自然语言接口做点什么,希望我的这篇博客能帮到你 ...
- 物流一站式单号查询之快递鸟API接口(附Demo源码)
连载篇提前看 物流一站式单号查询之快递鸟API接口 物流一站式查询之TrackingMore篇 物流一站式查询之顺丰接口篇 物流一站式查询之快递100 前情提要 前三篇中,我们已经从注册.申请接口.调 ...
- 快递Api接口 & 微信公众号开发流程
之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...
随机推荐
- POJ 3278: Catch That Cow
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 44613 Accepted: 13946 ...
- smartconfig配置模式
http://www.tuicool.com/articles/E3a2myi 这项技术由德州仪器提出, 并且应用在自己的CC3000系列芯片上. 不过, 从原理上来说, 支持混杂模式的wifi芯片都 ...
- Linux入门常用指令
linux获取硬盘和目录大小的命令 df命令 Linux下可以用df命令获取硬盘的使用情况,通过man可以获取df命令的详细情况.df命令经常用的参数为: a:显示全部的档案系统和各分割区的磁盘使用情 ...
- NIO之直接缓冲区与非直接缓冲区
直接缓冲区与非直接缓冲区的概念 一.非直接缓冲区 1)创建方式 通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基 ...
- ISA2006安装和部署基础(虚拟机非域环境)
0x00. 为了測试基于HTTP隧道的绕过ISA,必须搭建模拟环境,为了不麻烦,我们这里不配合域环境认证.本次实验利用Vmware 10.0搭建好开发环境,实现ISA2006安装和部署,同一时候设定基 ...
- Java8 stream学习
Java8初体验(二)Stream语法详解 Java 8 flatMap示例 第一个Stream Demo IDEA里面写Stream有个坑 虽然java文件中没错,但是但编译的时候还是报错了, In ...
- web开发中经常使用的js
将自己在web开发中经经常使用到的一些JS总结一下. 1.改动标签和表单的值 改动标签的值: var customer = document.getElementById("custm&qu ...
- iostat -d -k -x 1 10
iostat命令详解 转载 2011年08月03日 14:13:58 标签:磁盘 /扩展 /user 99809 iostat iostat用于输出CPU和磁盘I/O相关的统计信息. 命令格式: io ...
- Oracle Parallel模式
一.Parallel 1. 用途 强行启用并行度来执行当前SQL.这个在Oracle 9i之后的版本可以使用,之前的版本现在没有环境进行测试.也就是说,加上这个说明,可以强行启用Oracle的多线程处 ...
- ORA-06519: 检测到活动的自治事务处理,已经回退
写了一个函数,由于在定义时加入了 create or replace function F_计算结果(In_参数 varchar2) return number is --使用自治事务PRAGMA A ...