之前在网上找到一款下载某慕课网站的java版软件,我想知道他是怎么实现:对于视频的下载的,毕竟网页源码中大都不会直接放视频的地址,但是没有公布源码,我就反编译,等到了部分“源码”,逻辑上还是有些问题,所以还要自己修改一下。最终代码还是能和原程序一样跑,但是部分代码无法理解,他是怎么实现的,或者说他是怎么得到的。

  1. 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建立链接得到返回值

  1. Document jsondoc;
  2. jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
  3. String jsonData=jsondoc.text();

然后对返回数据的解析,json的数据结构由对象,数组,对象数组混合这么几种。可以通过http://www.bejson.com/整理数据,方便观察数据结构。

  1. JSONObject jsonObject=new JSONObject(jsonData);
  2. JSONArray data=jsonObject.getJSONArray("data");
  3.  
  4. System.out.println("查询结果:"+jsonObject.getString("message"));
  5. if (jsonObject.getString("message").equals("ok")){
  6. System.out.println("快递公司:"+jsonObject.getString("com"));
  7. System.out.println("快递单号:"+jsonObject.getString("nu"));
  8.  
  9. //具体信息
  10. for (int i=data.length()-1;i>0;i--){
  11. JSONObject object=data.getJSONObject(i);
  12. System.out.print(object.getString("time"));
  13. System.out.println(" "+object.getString("context"));
  14. }
  15. }

最后,时间关系,不详细讲解,直接上全部代码。

  1. package com;
  2.  
  3. import org.json.JSONArray;
  4. import org.json.JSONObject;
  5. import org.jsoup.Jsoup;
  6. import org.jsoup.nodes.Document;
  7. import java.io.IOException;
  8. import java.util.Scanner;
  9.  
  10. public class Main {
  11.  
  12. public static void main(String[] args) {
  13.  
  14. Document jsondoc;
  15. Scanner input=new Scanner(System.in);
  16. boolean yesNo;
  17. while (true) {
  18.  
  19. yesNo=true;
  20. System.out.println("快递公司编码:申通=\"st\" EMS=\"ems\" 顺丰=\"sf\" 圆通=\"yt\" 中通=\"zt\" 韵达=\"yd\" " +
  21. "天天=\"tt\" 汇通=\"ht\" 全峰=\"qf\" 德邦=\"db\" 宅急送=\"zjs\"");
  22. System.out.println("请输入快递公司编号和快递单号,中间用逗号或空格隔开,如(sf,123456789;sf,123456789;sf 123456789)");
  23. try {
  24. String string=input.nextLine();
  25. int num=string.indexOf(',');
  26. if (num==-1){
  27. num=string.indexOf(',');
  28. if (num==-1){
  29. num=string.indexOf(' ');
  30. }
  31. }
  32.  
  33. String CompanyNumber=string.substring(0,num);
  34. String OrderNumber=string.substring(num+1);
  35.  
  36. switch (CompanyNumber){
  37. case "st":
  38. CompanyNumber="shentong";
  39. break;
  40. case "ems":
  41. break;
  42. case "sf":
  43. CompanyNumber="shunfeng";
  44. break;
  45. case "yt":
  46. CompanyNumber="yuantong";
  47. break;
  48. case "zt":
  49. CompanyNumber="zhongtong";
  50. break;
  51. case "yd":
  52. CompanyNumber="yunda";
  53. break;
  54. case "tt":
  55. CompanyNumber="tiantian";
  56. break;
  57. case "ht":
  58. CompanyNumber="huitongkuaidi";
  59. break;
  60. case "qf":
  61. CompanyNumber="quanfengkuaidi";
  62. break;
  63. case "db":
  64. CompanyNumber="debangwuliu";
  65. break;
  66. case "zjs":
  67. CompanyNumber="zhaijisong";
  68. break;
  69. default:
  70. System.out.println("编号错误或暂不支持该快递公司的查询");
  71. yesNo=false;
  72. break;
  73. }
  74.  
  75. if (yesNo){
  76.  
  77. jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
  78. String jsonData=jsondoc.text();
  79. JSONObject jsonObject=new JSONObject(jsonData);
  80. JSONArray data=jsonObject.getJSONArray("data");
  81.  
  82. System.out.println("查询结果:"+jsonObject.getString("message"));
  83. if (jsonObject.getString("message").equals("ok")){
  84. System.out.println("快递公司:"+jsonObject.getString("com"));
  85. System.out.println("快递单号:"+jsonObject.getString("nu"));
  86.  
  87. //具体信息
  88. for (int i=data.length()-1;i>0;i--){
  89. JSONObject object=data.getJSONObject(i);
  90. System.out.print(object.getString("time"));
  91. System.out.println(" "+object.getString("context"));
  92. }
  93. }
  94.  
  95. }
  96.  
  97. } catch (IOException e) {
  98. e.printStackTrace();
  99. }
  100.  
  101. System.out.print("按回车键继续!");
  102. input.nextLine();
  103. }
  104. }
  105. }

运行结果展示:

本人刚接触java不久,语法结构不是很标准,严谨,希望大家谅解。如有问题可以相互交流。

谢谢阅读

基于网页api(接口)实现查快递的更多相关文章

  1. 基于Metaweblog API 接口一键发布到国内外主流博客平台

    之前的生活 之前一直使用evenote写博客和日志,其实还是挺方便的.但是我一直都希望能够同步到国内的博客和国外的blogspot等主流博客平台.而强大everote只提供了facebook.twit ...

  2. APISpace 全球快递物流查询API接口 免费好用

    前言   随着我国电子商务的迅猛发展,物流行业也开始突飞猛进,人们的日常生活越来越离不开快递服务,查快递.寄快递的需求越来越大,随之而来,常用快递接口的需求也越来越大. 全国快递查询接口,支持各大快递 ...

  3. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  4. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  5. 各种快递查询--Api接口

    授权成功我的密钥 爱查快递API使用说明文档 API地址: 以前:http://api.ickd.cn/?com=[]&nu=[]&id=[]&type=[]&enco ...

  6. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试【转】

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  7. 微信小程序+OLAMI(欧拉蜜)自然语言API接口制作智能查询工具--快递、聊天、日历等

    微信小程序最近比较热门,再加上自然语义理解也越来越被人关注,于是我想赶赶潮流,做一个小程序试试.想来想去快递查询应该是一种比较普遍的需求. 如果你也在通过自然语言接口做点什么,希望我的这篇博客能帮到你 ...

  8. 物流一站式单号查询之快递鸟API接口(附Demo源码)

    连载篇提前看 物流一站式单号查询之快递鸟API接口 物流一站式查询之TrackingMore篇 物流一站式查询之顺丰接口篇 物流一站式查询之快递100 前情提要 前三篇中,我们已经从注册.申请接口.调 ...

  9. 快递Api接口 & 微信公众号开发流程

    之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...

随机推荐

  1. eclipse工程重命名后,无法生产class问题

    在很多时候我们对project重新命名后,class文件始终没有生产,尤其是在web项目的时候,如果不注意class文件生成问题,会浪费大量的时间找错误.这里分享下如何解决eclipse重命名后cla ...

  2. POJ-3134-Power Calculus(迭代加深DFS)

    Description Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multipli ...

  3. SpringCloud系列十四:实现容错的手段

    1. 回顾 前面已用Eureka实现了微服务的注册与发现,Ribbon实现了客户端侧的负载均衡,Feign实现了声明式的API调用. 2. 实现容错的手段 如果服务提供者响应非常慢,那么消费者对提供者 ...

  4. c++ why doesn't c++ allow rebinding a reference ?

    http://stackoverflow.com/questions/27037744/why-doesnt-c-allow-rebinding-a-reference# 1. The primary ...

  5. 配置HADOOP_HOME

    配置HADOOP_HOME export HADOOP_HOME=/usr/hadoop-1.2.0export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sb ...

  6. openfile

    linux修改open files数   概要 linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不 ...

  7. python第二周数据类型 字符编码 文件处理

    第一数据类型需要学习的几个点: 用途 定义方式 常用操作和内置的方法 该类型总结: 可以存一个值或者多个值 只能存储一个值 可以存储多个值,值都可以是什么类型 有序或者无序 可变或者不可变 二:数字整 ...

  8. NERDTree 快捷件

    key description ctrl+e 打开/关闭文件浏览器 j 向下移动 k 向上移动 o 小写字母o,打开文件或者展开目录 shift+c 即大写字母C,当前选中目录作为根目录 u 上一层目 ...

  9. Eclipse 创建 Java 包

    打开新建 Java 包向导 你可以使用新建 Java 包向导来创建 Java 包.Java 包向导打开方式有: 通过点击 "File" 菜单并选择 New > Package ...

  10. cv resource

    http://blog.sina.com.cn/s/blog_5086c3e20101kdy5.html