用JAVA調用.net的webservice執行個體

來源:互聯網
上載者:User
  最近做的項目都是同webService有關的,自然就要關心一下webservice方面的資源。
http://www.wopos.com/webservice/Weather.asmx?op=getWeather

是一個天氣預報的webservice,從它的輸出結果來看天氣資料應該來自中央氣象局的問天網

http://www.tq121.com.cn/

不過這方面就不用再多關心了,我們關心的是怎樣調用這個webservice。
       首先登入www.wopos.com/webservice/Weather.asmx?op=getWeather。可以看到如下的SOAP資訊 
請求:

以下內容為程式碼:

POST /webservice/Weather.asmx http/1.1
Host: www.wopos.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/getWeather"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getWeather xmlns="http://tempuri.org/">
      <mCity>string</mCity>
    </getWeather>
  </soap:Body>
</soap:Envelope>

把XML部分全部複製下來建立一個XML檔案(普通的文字檔也可以),為了以後編程方面,把

以下內容為程式碼:

                       ...
      <mCity>string</mCity> 
                       ...

改成

以下內容為程式碼:

                      ...
      <mCity>${city}$</mCity> 
                       ...

以weathersoap.xml儲存在以後產生的類的同一目錄。

響應:

以下內容為程式碼:

http/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="h ttp://www.w3.org/2001/XMLSchema" xmlns:soap="h ttp://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getWeatherResponse xmlns="h ttp://tempuri.org/">
      <getWeatherResult>string</getWeatherResult>
    </getWeatherResponse>
  </soap:Body>
</soap:Envelope>

在後面對XML的解釋要用到響應部分的XML描述

        接下就開始寫代碼了。

以下內容為程式碼:

package jaqcy.weatherreport.client;

import java.io.*;
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
/**
 *
 * @author jaqcy
 */
public class WeatherReport 
{    
    private static String getSoapRequest(String city)//city為要查詢天氣的城市名
    {
        try 
        {
            Class cls=Object.class;
            InputStreamReader isr=new InputStreamReader(cls.getResourceAsStream("/jaqcy/weatherreport/client/weathersoap.xml"));//讀取存在weathersoap的SOAP資訊
            BufferedReader reader=new BufferedReader(isr);
            String soap="";
            String tmp;
            while((tmp=reader.readLine())!=null)
            {
                soap+=tmp;
            }            
            reader.close();
            isr.close();
            return soap.replace("${city}$",city);//用傳入的參數city替換原來的${city}$
        } 
        catch (Exception ex) 
        {
            ex.printStackTrace();
            return null;
        }
    }
  /*
    *返回InputStream是因為w3c DOM中Document的parse方法可
    *以接受InputStream類型的參數,方面在下一步對XML的解釋
    */
    private static InputStream getSoapInputStream(String city)throws Exception
    {
        try
        {
            String soap=getSoapRequest(city);
            if(soap==null)
            {
                return null;
            }
            URL url=new URL("http://www.wopos.com/webservice/Weather.asmx");
            URLConnection conn=url.openConnection();
            conn.setUseCaches(false);
            conn.setDoInput(true);
            conn.setDoOutput(true);

            conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
            conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
            conn.setRequestProperty("SOAPAction","/"http://tempuri.org/getWeather/"");

            OutputStream os=conn.getOutputStream();
            OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");
            osw.write(soap);
            osw.flush();
            osw.close();

            InputStream is=conn.getInputStream();            
            return is;   
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
/*
  *用W3C DOM對返回的XML進行解釋
  *
  */
    public static String getWeather(String city)
    {
        try
        {
            Document doc;
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            DocumentBuilder db=dbf.newDocumentBuilder();
            InputStream is=getSoapInputStream(city);
            doc=db.parse(is);
            NodeList nl=doc.getElementsByTagName("getWeatherResult");
            Node n=nl.item(0);
            String weather=n.getFirstChild().getNodeValue();
            is.close();
            return weather;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}

寫個main方法檢驗一下結果

以下內容為程式碼:

    public static void main(String[] args)throws Exception
    {
        System.out.println(WeatherReport.getWeather("珠海"));
    }

結果如下

以下內容為程式碼:

城市==珠海,日期==4.02-4.03,圖1==http://weather.tq121.com.cn/images/a1.gif,圖2==http://weather.tq121.com.cn/images/00.gif,天氣==多雲,溫度==28℃~22℃,風==微風,紫外線==弱

結果是有點亂,不過只要把它分割開來也是很容易的事。
        在自己的應用程式中加上天氣預報的功能,對程式的競爭力也是有好處的,而且實現也相當的簡單,何樂而不為呢?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.