java通過報文交換數據

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.dis
connect()();
  }
  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);
 }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章