API开发实践(四) 返回HTML

分为两个部分:生成HTML和返回HTML

生成HTML:

最终想要的时显示地图,不可避免的使用高德地图的API。

【地图API】地址录入时如何获得准确的经纬度?淘宝收货地址详解

改变几个参数即可达到目的,很简单不讲了。

重点说说如何生成查询结果对应的HTML:

将HTML中的内容保存为String,在String格式的基础上替换关键参数,即可批量生产。

在将HTML保存为String时,因为HTML内容都是带换行缩进的,还带有许多双引号,所以直接粘贴实不可取的。

我用的方法是将内容先保存在文本中,再通过IO流读取,并且一定要做到:

删除所有换行符

将双引号替换为单引号

将所有注释都去掉

否则不满足前两条,String格式会报错;

不满足最后一条,输出的时候因为没有换行符,“//”又是行注释,会导致把第一个“//”后的所有内容都认为是注释而无法执行。

代码:getHtml.java

 1 package util;
 2
 3 import java.util.List;
 4 import java.util.regex.Pattern;
 5
 6 public class getHtml {
 7     public getHtml(){}
 8     public String creatHtml(List<String> list){
 9         String html = null;
10         String add = "";
11         int j = list.size();
12           for(int i = 1; i < j ; i++ ){
13           if(i != j - 1){
14           add = add + list.get(i) + "--->";
15           }else{
16           add = add + list.get(i);}
17           }
18           String address = list.get(j-1);
19           html = "<html>  <head>    <base href=‘<%=basePath%>‘>              <meta http-equiv=‘pragma‘ content=‘no-cache‘>    <meta http-equiv=‘cache-control‘ content=‘no-cache‘>    <meta http-equiv=‘expires‘ content=‘0‘>        <meta http-equiv=‘keywords‘ content=‘keyword1,keyword2,keyword3‘>    <meta http-equiv=‘description‘ content=‘This is my page‘>    <script type=‘text/javascript‘ src=‘http://webapi.amap.com/maps?v=1.3&key=0250860ccb5953fa5d655e8acf40ebb7&plugin=AMap.Geocoder‘></script>    <script type=‘text/javascript‘ src=‘http://cache.amap.com/lbs/static/addToolbar.js‘></script>    <style>        #addressBox{height:20px;width:600px;}        #mapBox{height:400px;width:600px}        #pointBox{height:20px;width:600px;}    </style>    <!--    <link rel=‘stylesheet‘ type=‘text/css‘ href=‘styles.css‘>    -->  </head>    <body onload=‘geocoder();‘>   "
20                   + " <p>物流轨迹:</p>      "
21                   + "<p>"+add+"</p>"
22                   + "<div>           <p>当前所在位置</p>        </div>        <div id=‘pointBox‘>&nbsp;</div>        <div id=‘mapBox‘></div>    <div>    如果不够准确,可以拖动地图改变经纬度    </div>    "
23                   + "<script type=‘text/javascript‘> var address =‘"+address
24                   + "‘;var $pointBox = document.getElementById(‘pointBox‘);            var map = new AMap.Map(‘mapBox‘, {                   resizeEnable: true,            center: [116.397428, 39.90923],            zoom:14        });            function addMarker(point) {            var marker = new AMap.Marker({            map: map,            position: [ point.getLng(),  point.getLat()]        });    }            function addCenterPoint(){                map.clearMap();            var centerPoint = map.getCenter();            addMarker(centerPoint);            $pointBox.innerHTML = ‘当前经纬度为:‘ + centerPoint.getLng() + ‘,‘ + centerPoint.getLat();    }        addCenterPoint();        function geocoder() {               map.clearMap();            var myGeo = new AMap.Geocoder();            myGeo.getLocation(address, function(status, result) {            if (status === ‘complete‘ && result.info === ‘OK‘) {                     geocoder_CallBack(result);        }else{                      $pointBox.innerHTML = ‘查无此地址‘;        }        });    }                function geocoder_CallBack(data) {            var resultStr = ‘‘;               var geocode = data.geocodes;            addMarker(geocode[0].location);            resultStr += ‘当前坐标</b>:‘ + geocode[0].location.getLng() + ‘, ‘ + geocode[0].location.getLat();            map.setFitView();            $pointBox.innerHTML = resultStr;    }        map.on(‘moveend‘, function() {            addCenterPoint();    });    </script>  </body></html>";
25           String str = html.replaceAll( "\‘", "\"");
26           return str;
27     }
28 }

大家可以看到String html定义哪一行是如何处理更改参数和处理格式的。可以和最开始链接中的代码进行对比。

返回HTML:

不说了,直接代码:getMap.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String shipperCode = request.getParameter("ShipperCode");
        String logisticCode = request.getParameter("LogisticCode");
        System.out.println(shipperCode+","+logisticCode);
        kdniaoTrackQueryAPI kdnAPI = new kdniaoTrackQueryAPI();
        List<String> result = kdnAPI.Return(shipperCode,logisticCode);
        String name = "";
        if(result.get(0).equals("0")){
            name = "<html><head><title>t.html</title></head><body>"+result.get(1)+"<br></body></html>";
        }else if(result.get(0).equals("1")){
            getHtml gH = new getHtml();
            name = gH.creatHtml(result);
        }else{
            name = "<html><head><title>t.html</title></head><body>"+result.get(1)+"<br></body></html>";
        }

        //返回文本数据
        response.setContentType("text/plain;charset=UTF-8");
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(name.getBytes("UTF-8"));
        outputStream.flush();
        outputStream.close();
    }

随便查查就有返回的方法

调用方法实例:

如何调用我的API

 1 package test;
 2 import java.io.BufferedReader;
 3 import java.io.File;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter;
 8 import java.io.PrintWriter;
 9 import java.net.HttpURLConnection;
10 import java.net.URL;
11 import java.net.URLEncoder;
12 import java.util.Map;
13
14 public class test1 {
15     public static void main(String args[]){
16         //请求url
17         String URL="安全起见,不可说,等我发布前端地址";
18         String ShipperCode = ""//物理公司编号;
19         String LogisticCode = ""//物流运单号;
20         String ReqURL = URL + "?ShipperCode=" + ShipperCode + "&LogisticCode=" + LogisticCode;
21         String result = sendPost(ReqURL);
22         write(result,"test");
23     }
24      /**
25      * 向指定 URL 发送POST方法的请求
26      * @return 远程资源的响应结果
27      */
28     private static String sendPost(String url) {
29         OutputStreamWriter out = null;
30         BufferedReader in = null;
31         StringBuilder result = new StringBuilder();
32         try {
33             URL realUrl = new URL(url);
34             HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
35             // 发送POST请求必须设置如下两行
36             conn.setDoOutput(true);
37             conn.setDoInput(true);
38             // POST方法
39             conn.setRequestMethod("POST");
40             // 设置通用的请求属性
41             conn.setRequestProperty("accept", "*/*");
42             conn.setRequestProperty("connection", "Keep-Alive");
43             conn.setRequestProperty("user-agent",
44                     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
45             conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
46             conn.setRequestProperty("kdniao-nocache", "true");
47             conn.connect();
48             // 获取URLConnection对象对应的输出流
49             out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
50             // 定义BufferedReader输入流来读取URL的响应
51             in = new BufferedReader(
52                     new InputStreamReader(conn.getInputStream(), "UTF-8"));
53             String line;
54             while ((line = in.readLine()) != null) {
55                 result.append(line);
56             }
57         } catch (Exception e) {
58             e.printStackTrace();
59         }
60         //使用finally块来关闭输出流、输入流
61         finally{
62             try{
63                 if(out!=null){
64                     out.close();
65                 }
66                 if(in!=null){
67                     in.close();
68                 }
69             }
70             catch(IOException ex){
71                 ex.printStackTrace();
72             }
73         }
74         return result.toString();
75     }
76     /*@result 服务器返回的html
77      *@fileName 保存的文件名字
78      * */
79     public static void write(String result,String fileName) {
80          FileWriter fw = null;
81          try {
82          //如果文件存在,则追加内容;如果文件不存在,则创建文件
83          File f=new File("E:\\"+fileName+".html");
84          fw = new FileWriter(f, true);
85          } catch (IOException e) {
86          e.printStackTrace();
87          }
88          PrintWriter pw = new PrintWriter(fw);
89          pw.print(result);
90          pw.flush();
91          try {
92          fw.flush();
93          pw.close();
94          fw.close();
95          } catch (IOException e) {
96          e.printStackTrace();
97          }
98          }
99 }
时间: 2024-10-31 03:12:09

API开发实践(四) 返回HTML的相关文章

API开发第四篇:定义客户端/服务端接口协议

在进行API开发的时候,需要事先定义好app与server交互的数据格式,这样前端人员与服务端人员才能够事先决定好如何获取数据.如何解析数据.如何传输协议. 在我看来目前接口协议无外乎这三种情况: 1. json数据进行交互 2. xml数据进行交互 3. 自定义数据格式交互 自定义数据格式进行前后端的数据交互,需要花费较大的精力,而且需要很有经验的人设计的协议才会确保各个平台的兼容以及良好的可阅读性.并且解析.封装都需要自己来用代码实现,很多第三方库都没办法用上.因为这里我不进行讨论.主要说说

API开发实践(一) 结构设计

参加了2017年的阿里云API创新大赛,自己一个人参加的第一赛段,把开发过程中的学到的知识总结一下. 我设计的API功能:用户输入自己货物的订单编号及公司编号,返回物流信息地图. 实现方法:调用两个API,一个是快递鸟快递查询API,一个是高德地图地图查询API,利用servlet处理上传的数据并返回一个HTML显示地图. 开发模式:JavaBean+servlst+html 开发工具:阿里云服务器.Tomcat.MyEclipse.org.json.jar 功能模块: 接受url请求 调用快递

API开发实践(三) 查询物流路径

查询物流可以使用现成的API,本文使用的快递鸟查询. 查询方法主要在两个类:errorManage.kdniaoTrackQueryAPI中 各种快递查询Api接口(快递鸟) 调用API一定要仔细阅读文档,了解编码格式.请求方式.参数设置等信息. 上代码之前先说一下数据结构: 我们想要的物流路径可由一系列地址组成,但在实际操作中还存在查询失败及没有物流信息的情况,所以还要返回一个查询状态信息. 所以选择一个能储存所需信息的最简单结构,用List结构传递即可. 规定List第一位存储Int型转状态

API开发实践(二) 接受url请求

先简单理解GET请求与POST请求的区别 HTTP请求中POST与GET的区别 在浏览器地址栏输入 http://服务器地址:服务器端口/文件路径 即可访问目的文件或服务 如果带有参数就以 ?参数名=参数值[&参数名=参数值].* 的形式添加到请求中,再在服务器中用request.getParameter()方法取出. 代码:url:  http://localhost:8080/APITest/getMap.java?shipperCode="*"&logisticC

ASP.NET-FineUI开发实践-9(四)

现在是这么个问题,在开发中表格是动态出来的,就是标准板是全部字段列出,客户要根据情况列出自己想要的,在增加操作页面的同时要是能用前台自带的功能直接保存到后台就好了,现在的列显示和隐藏是不回发的. 1.FineUI引用的extjs是ext-part1.js,这就不说了,以前截过图,这个文件是压缩的,参数也是简化的不好看,其实这个就是ext-all.js,ext-all哪来的呢,就是extjs官方实例里下的,下来之后也是压缩的,旁边还有个不压缩的,ext-all-debug.js ,完全可以看,那我

Git工程开发实践(四)——Git分支管理策略

Git工程开发实践(四)--Git分支管理策略 一.Git版本管理的挑战 Git是非常优秀的版本管理工具,但面对版本管理依然有非常大得挑战.工程开发中,开发者彼此的代码协作必然带来很多问题和挑战:A.如何开始一个Feature开发,而不影响其它Feature?B.由于很容易创建新分支,分支多了如何管理,时间久了,如何知道每个分支是干什么的?C.哪些分支已经合并回了主干?D.如何进行Release的管理?开始一个Release的时候如何冻结Feature, 如何在Prepare Release的时

构建你的长寿命的API第1部分:规范驱动的API开发

构建你的长寿命的API第1部分:规范驱动的API开发 这篇文章是由MuleSoft的Mike Stowe在nginx.conf 2016公布的演示文稿改编的.第一部分重点是规范驱动的API开发. 第二部分讨论的最佳实践.你能够查看完整的呈现的记录的v=G8p4g3yYLBw">YouTube.详细信息例如以下: 0:00 介绍 1:52 API正在改变世界 2:32 API正在连接一切 3:36 API应该是持久的 4:01 构建一个持久的API的5个步骤 4:38 从长计议 6:03 你

Android软件安全开发实践(下)

Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你走上Android软件安全开发实践之旅. 过去两年,研究人员已发现Android上的流行软件普遍存在安全缺陷或安全漏洞.漏洞频发的原因可能有很多,例如以下几种. 与一切都是集中管理的iOS相比,Android提供了一种开放的环境,在获得了灵活性.可以满足各种定制需求的同时,也损失了部分安全性. 开发

【核心API开发】Spark入门教程[3]

本教程源于2016年3月出版书籍<Spark原理.机制及应用> ,在此以知识共享为初衷公开部分内容,如有兴趣,请支持正版书籍. Spark综合了前人分布式数据处理架构和语言的优缺点,使用简洁.一致的函数式语言Scala作为主要开发语言,同时为了方便更多语言背景的人使用,还支持Java.Python和R语言.Spark因为其弹性分布式数据集(RDD)的抽象数据结构设计,通过实现抽象类RDD可以产生面对不同应用场景的子类.本章将先介绍Spark编程模型.RDD的相关概念.常用API源码及应用案例,