• 基于网页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"));
        }
    }    

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

      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 
     37                 switch (CompanyNumber){
     38                     case "st":
     39                         CompanyNumber="shentong";
     40                         break;
     41                     case "ems":
     42                         break;
     43                     case "sf":
     44                         CompanyNumber="shunfeng";
     45                         break;
     46                     case "yt":
     47                         CompanyNumber="yuantong";
     48                         break;
     49                     case "zt":
     50                         CompanyNumber="zhongtong";
     51                         break;
     52                     case "yd":
     53                         CompanyNumber="yunda";
     54                         break;
     55                     case "tt":
     56                         CompanyNumber="tiantian";
     57                         break;
     58                     case "ht":
     59                         CompanyNumber="huitongkuaidi";
     60                         break;
     61                     case "qf":
     62                         CompanyNumber="quanfengkuaidi";
     63                         break;
     64                     case "db":
     65                         CompanyNumber="debangwuliu";
     66                         break;
     67                     case "zjs":
     68                         CompanyNumber="zhaijisong";
     69                         break;
     70                     default:
     71                         System.out.println("编号错误或暂不支持该快递公司的查询");
     72                         yesNo=false;
     73                         break;
     74                 }
     75 
     76                 if (yesNo){
     77 
     78                     jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
     79                     String jsonData=jsondoc.text();
     80                     JSONObject jsonObject=new JSONObject(jsonData);
     81                     JSONArray data=jsonObject.getJSONArray("data");
     82 
     83                     System.out.println("查询结果:"+jsonObject.getString("message"));
     84                     if (jsonObject.getString("message").equals("ok")){
     85                         System.out.println("快递公司:"+jsonObject.getString("com"));
     86                         System.out.println("快递单号:"+jsonObject.getString("nu"));
     87 
     88                         //具体信息
     89                         for (int i=data.length()-1;i>0;i--){
     90                             JSONObject object=data.getJSONObject(i);
     91                             System.out.print(object.getString("time"));
     92                             System.out.println(" "+object.getString("context"));
     93                         }
     94                     }
     95 
     96                 }
     97 
     98             } catch (IOException e) {
     99                 e.printStackTrace();
    100             }
    101 
    102             System.out.print("按回车键继续!");
    103             input.nextLine();
    104         }
    105     }
    106 }

    运行结果展示:

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

    谢谢阅读

     

  • 相关阅读:
    SQL数据转移
    怎么将控制台的打印输出到文本文件中
    用来控制 XML 序列化的属性
    excel内容转成xml
    HTTP状态码
    char、varchar、nchar、nvarchar的区别
    C# Cookie编程
    android的原理--为什么我们不需要手动关闭程序
    HTTP协议及HTTP包
    HTTP 方法:GET 对比 POST
  • 原文地址:https://www.cnblogs.com/jinxiaohang/p/6886533.html
Copyright © 2020-2023  润新知