1.交互模式
交互模式爲:請求/響應交互模式。需要數據一方作爲請求方,提供數據一方作爲響應方。請求方發送一個帶有參數的報文到響應方,響應方根據請求ip地址、報文中的參數等判斷請求是否合法,如果不合法,返回包含錯誤信息報文,如果合法,則根據請求報文中的參數獲取相應的數據,然後組裝成響應報文發送回請求方。
請求方可以是java程序、.net程序、php程序等,響應方是一個servlet。爲了簡單起見,一個servlet對應一個接口。
2.接口
接口的請求和響應採用 XML 作爲具體業務報文的載體,請求爲POST 方式,
傳輸時的charset 需要設置爲utf-8
2.1巡檢報表接口
2.1.1說明
巡檢報表需要顯示的數據如下圖:
地市 | 代理公司 | 區縣 | 專業 | 人員 | 開始日期 | 結束日期 | 計劃明細數 | 合格明細數 | 巡檢率 |
巡檢報表響應地址:http://xxx.xxx.xxx.xxx/xxxservlet
2.1.2請求報文
報文格式
<?xml version="1.0" encoding="UTF-8"?>
<report_data>
<request_req>953947334</request_req>
<request_time>2012040211394324</request_time>
<request_param>
<query_month>201203</query_month>
</request_param>
</report_data>
報文解釋
節點名稱 | 中文名稱 | 類型 | 說明 |
request_req | 請求流水號 | String(32) | 每筆請求的流水號必須不同,以示區分 |
request_time | 請求時間 | String(14) | 發起請求段時間,格式:yyymmddhhnnss |
query_month | 月份 | String(6) | 需要獲取數據的月份 |
2.1.3響應返回報文
報文格式
<?xml version="1.0" encoding="UTF-8"?>
<report_data>
<respon_req>953947334</respon_req>
<respon_time>20120402113943</respon_time>
<result>
<id>0000</id>
<comment>成功</comment>
</result>
<items>
<item>
<county>長治縣</county>
<company>鐵通</company>
<speciality>線路</speciality>
<personnel>王加和</personnel>
<begin_time>20120301000000</begin_time>
<end_time>20120331235959</end_time>
<plan_quantity>50</plan_quantity>
<checkout_quantity>40</checkout_quantity>
<patrol_rate>0.80</patrol_rate>
</item>
<item>
<county>長治縣</county>
<company>晉通管道維護公司</company>
<speciality>線路</speciality>
<personnel>李小林</personnel>
<begin_time>20120301000000</begin_time>
<end_time>20120331235959</end_time>
<plan_quantity>30</plan_quantity>
<checkout_quantity>10</checkout_quantity>
<patrol_rate>0.66</patrol_rate>
</item>
<item>
<county>方山縣</county>
<company>晉通管道維護公司</company>
<speciality>線路</speciality>
<personnel>陳強</personnel>
<begin_time>20120301000000</begin_time>
<end_time>20120331235959</end_time>
<plan_quantity>60</plan_quantity>
<checkout_quantity>30</checkout_quantity>
<patrol_rate>0.50</patrol_rate>
</item>
......
</items>
</report_data>
報文解釋
節點名稱 | 中文名稱 | 類型 | 說明 |
respon_req | 響應流水號 | String(32) | 每筆響應的流水號必須不同,以示區分 |
respon_time | 響應時間 | String(14) | 響應時間,格式:yyymmddhhnnss |
id | 響應碼 | String(5) | 系統返回的處理結果,詳見 接口返回錯誤碼錶 |
comment | 響應碼解釋 | String(500) | 響應碼對應中文註解 |
county | 縣區 | String(10) | 縣區名稱 |
company | 代維公司 | String(30) | 代維公司名稱 |
speciality | 專業 | String(10) | 專業名稱 |
personnel | 人員 | String(20) | 巡檢人員名稱 |
begin_time | 開始時間 | String(14) | 開始時間, 格式:yyymmddhhnnss |
end_time | 結束時間 | String(14) | 結束時間, 格式:yyymmddhhnnss |
plan_quantity | 計劃明細數 | Number(7) | 計劃明細數 |
checkout_quantity | 合格明細數 | Number(7) | 合格明細數 |
patrol_rate | 巡檢率 | Number(7) | 巡檢率 |
備註:如請求非法或參數錯誤,則響應報文中無items節點
2.2xxxx報表接口
2.3xxxx報表接口
2.4xxxx報表接口
4.接口錯誤返回碼
響應代碼 | 代碼解釋 |
0000 | 交易成功 |
0010 | 請求IP地址非法 |
0020 | 請求報文解析錯誤 |
0030 | 無法獲取請求報文 |
0040 | 該接口不支持GET 方式,請以POST 方式提交 |
...... | ...... |
5.程序示例
5.1請求程序代碼
public void sendMessage() throws Exception {
System.out.println("調用servlet開始=================");
StringBuffer sendStr = new StringBuffer();
sendStr.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sendStr.append("<report_data>");
sendStr.append("<request_req>953943547334</request_req>");
sendStr.append("<request_time>2012040211394324</request_time>");
sendStr.append("<request_param>");
sendStr.append("<query_month>201203</query_month>");
sendStr.append("</request_param>");
sendStr.append("</report_data>");
BufferedReader reader = null;
try {
String strMessage = "";
StringBuffer buffer = new StringBuffer();
// 接報文的地址
URL uploadServlet = new URL(
"http://localhost:9090/TestTransfers");
HttpURLConnection servletConnection = (HttpURLConnection) uploadServlet
.openConnection();
// 設置連接參數
servletConnection.setRequestMethod("POST");
servletConnection.setDoOutput(true);
servletConnection.setDoInput(true);
servletConnection.setAllowUserInteraction(true);
// 開啓流,寫入XML數據
OutputStream output = servletConnection.getOutputStream();
System.out.println("發送的報文:");
System.out.println(sendStr.toString());
output.write(sendStr.toString().getBytes());
output.flush();
output.close();
// 獲取返回的數據
InputStream inputStream = servletConnection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
while ((strMessage = reader.readLine()) != null) {
buffer.append(strMessage);
}
System.out.println("接收返回值:" + buffer);
} catch (java.net.ConnectException e) {
throw new Exception();
} finally {
if (reader != null) {
reader.close();
}
}
}
5.2響應程序代碼
public class TestTransfers extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//判斷請求報文是否來自代維繫統的ip地址
String ip = request.getRemoteHost();
// 獲取收到的報文
BufferedReader reader = request.getReader();
String line = "";
StringBuffer inputString = new StringBuffer();
while ((line = reader.readLine()) != null) {
inputString.append(line);
}
//如有必要,可以在報文中增加其他驗證和加密的參數
//解析獲取到的報文,根據ip地址、其他驗證、加密等等來判斷請求報文的服務器是否有權限
//如果請求驗證合格,則根據請求的參數裝配返回的報文
// 要返回的報文
StringBuffer resultBuffer = new StringBuffer();
resultBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
resultBuffer.append("<report_data>");
resultBuffer.append("<respon_req>953947334</respon_req>");
resultBuffer.append("<respon_time>20120402113943</respon_time>");
resultBuffer.append("<result>");
resultBuffer.append("<id>0000</id>");
resultBuffer.append("<comment>成功</comment>");
resultBuffer.append("</result>");
resultBuffer.append("<items>");
resultBuffer.append("<item>");
resultBuffer.append("<county>長治縣</county>");
resultBuffer.append("<company>鐵通</company>");
resultBuffer.append("<speciality>線路</speciality>");
resultBuffer.append("<personnel>王加和</personnel>");
resultBuffer.append("<begin_time>20120301000000</begin_time>");
resultBuffer.append("<end_time>20120331235959</end_time>");
resultBuffer.append("<plan_quantity>50</plan_quantity>");
resultBuffer.append("<checkout_quantity>40</checkout_quantity>");
resultBuffer.append("<patrol_rate>0.80</patrol_rate>");
resultBuffer.append("</item>");
//......
//......
//......
//循環組裝響應的報文
resultBuffer.append("</items>");
resultBuffer.append("</report_data>");
// 設置發送報文的格式
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println(resultBuffer.toString());
out.flush();
out.close();
}
}
給你一個吧,這個能抓取任何程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class WebClient{
public static String getWebContent(String urlString,final String charset,int timeout) throws IOException {
if(urlString==null||urlString.length()==0) {
return null;
}
urlString = (urlString.startsWith("http://") || urlString
.startsWith("https://")) ? urlString : ("http://" + urlString)
.intern();
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn
.setRequestProperty(
"User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");//增加報頭,模擬瀏覽器,防止屏蔽
conn.setRequestProperty("Accept", "text/html");//只接受text/html類型,當然也可以接受圖片,pdf,*/*任意,就是tomcat/conf/web裏面定義那些
conn.setConnectTimeout(timeout);
try {
if(conn.getResponseCode()!=HttpURLConnection.HTTP_OK) {
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
InputStream input = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input,
charset));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = reader.readLine()) != null) {
sb.append(line).append("\r\n");
}
if(reader!=null) {
reader.close();
}
if(conn!=null) {
conn.disconnect()();
}
return sb.toString();
}
public static String getWebContent(String urlString) throws IOException {
return getWebContent(urlString,"iso-8859-1",5000);
}
public static void main(String[]args) throws IOException {
String s = getWebContent("http://www.sina.com");
s = new String(s.getBytes("iso-8859-1"),"gb2312");
System.out.println(s);
}
}