1. 程式人生 > >webservice:(1)新手搭建呼叫webservice那些坑

webservice:(1)新手搭建呼叫webservice那些坑

前言

今天主要和大家分享搭建java版webservice,以及php呼叫webservice遇到的一些坑。部落格內容大部分純手打,純親測。
注:網上有很多使用Eclipse構建webservice的教程,不過配置較麻煩,而且最後可能還訪問不了。因此,此部落格採用MyEclipse搭建。需注意一點,MyEclipse10及以下的支援不了pattern庫,因此釋出的專案如果包含Pattern則無法支援,這也是博主換IDE的原因。

說明

開發環境:MyEclipse2014,JAX-WS構建(容易使用),Tomcat 7

何為WebService?

它是一種構建應用程式的普遍模型,可以在任何支援網路通訊的作業系統中實施執行;它是一種新的web應用程式分支,是自包含、自描述、模組化的應用,可以釋出、定位、通過web呼叫。 WebService

是一個應用元件,它邏輯性的為其他應用程式提供資料與服務.各應用程式通過網路協議和規定的一些標準資料格式(Http,XML,Soap)來訪問 WebService ,通過 WebService 內部執行得到所需結果. WebService 可以執行從簡單的請求到複雜商務處理的任何功能。一旦部署以後,其他 WebService 應用程式可以發現並呼叫它部署的服務。

關鍵的技術和規則

在構建和使用Web Service時,主要用到以下幾個關鍵的技術和規則:

  • XML:描述資料的標準方法.
  • SOAP:表示資訊交換的協議.
  • WSDL:Web服務描述語言.
  • UDDI:通用描述、發現與整合,它是一種獨立於平臺的,基於XML語言的用於在網際網路上描述商務的協議.

XML

可擴充套件的標記語言(XML)是Web service平臺中表示資料的基本格式。除了易於建立和易於分析外,XML主要的優點在於它既是平臺無關的,又是廠商無關的。無關性是比技術優越性更重要的:軟體廠商是不會選擇一個由競爭對手所發明的技術的。

SOAP

SOAP是web service的標準通訊協議,SOAP為simple object access protocoll的縮寫,簡單物件訪問協議. 它是一種標準化的傳輸訊息的XML訊息格式。

WSDL

WSDL的全稱是web service Description Language,是一種基於XML格式的關於web服務的描述語言。其主要目的在於web service的提供者將自己的web服務的所有相關內容,如所提供的服務的傳輸方式,服務方法介面,介面引數,服務路徑等,生成相應的完全文件,釋出給使用者。使用者可以通過這個WSDL文件,建立相應的SOAP請求訊息,通過HTTP傳遞給webservice提供者;web服務在完成服務請求後,將SOAP返回訊息傳回請求者,服務請求者再根據WSDL文件將SOAP返回訊息解析成自己能夠理解的內容。

UDDI

將web service進行UDDI註冊釋出,UDDI是一種建立登錄檔服務的規範,以便大家將自己的web service進行註冊釋出供使用者查詢.然而當服務提供者想將自己的web service向全世界公佈,以便外部找到其服務時,那麼服務提供者可以將自己的web service註冊到相應的UDDI商用註冊網站,目前全球有IBM等4家UDDI商用註冊網站。因為WSDL檔案中已經給定了web service的地址URI,外部可以直接通過WSDL提供的URI進行相應的web service呼叫。所以UDDI並不是一個必需的web service元件,服務方完全可以不進行UDDI的註冊。

具體例項

(一) 開始搭建webservice

前提

首先安裝好MyEclipse2014,保證jdk環境配置好了,有tomcat伺服器(沒有也沒關係,MyEclipse自帶MyEclipse Tomcat 7,親測好用,預設埠為8080)。

  • 建立釋出webservice
  • 配置Tomcat
  • 部署專案並啟動Tomcat伺服器
  • 新增JAX-WS庫
  • 測試webservice

編碼

1. 建立釋出webservice

新建Web Service Project

然後填好資訊並next

然後接下來一直next,可選擇生成web.xml.
這是剛新建的專案結構

2. 然後新建一類檔案UserInfo.java

示例原始碼:

package com.yuan.webservice;
/**
 * 
 * @author Joryun
 *
 */
public class UserInfo {
    public String GetUserInfo(){
        return "源哥";
    }

    public String ParameterTest(String user, String pwd){
        return user+":"+pwd;
    }
}
3. 接下來發布web service

4. 選擇從java類建立web service

5. 選擇訪問的java class

6. 生成WSDL(WSDL以上有介紹,不懂可以回去看)

7. 釋出後的專案結構如下

(二) 配置Tomcat

前提

假定你需要使用自己本機Tomcat的情況下

過程

Window-Preferences-MyEclipse-Servers-Tomcat


配置好後Apply-OK.

部署專案並啟動Tomcat伺服器

部署此專案到伺服器


選擇完後Finish

接下來啟動Tomcat伺服器

伺服器已啟動的圖例

新增JAX-WS庫

在專案的構建路徑中新增庫檔案

測試webservice

輸入URL,出現圖式效果即為釋出成功.

http://localhost:8080/WebServiceDemo/UserInfoPort?wsdl

PHP呼叫webservice

說明

博主採用CI框架測試,但不用框架也一樣。並且php專案檔案釋出到了xampp上,直接訪問本地即可檢視效果。

關於php呼叫webservice,親測過兩種方法:
1. 引入nusoap.php,呼叫call()方法
2. php5自帶函式測試,classMap方式傳值

1. 引入nusoap.php,呼叫call()方法

特別注意:以下兩處圈紅圈的是坑點,一開始測試的時候用的是webservice介面名的引數,即user,pwd.但實際上列印到網頁上之後才發現引數是arg0和arg1。。。

2. php5自帶函式測試,classMap方式傳值

以下貼PHP實現原始碼:

<?php
header('Content-Type: text/html; charset=UTF-8');
/**
 * Class Test
 * Joryun
 *
 * 呼叫webservice測試類
 */
class Test extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        /**
         * nusoap.php需在網上下載,並將該php檔案包含進專案空間
         * 引入nusoap.php,呼叫call()方法
         */
//        require_once ("libs/nusoap.php");
//
//        // Create the client instance
//        $client = new nusoap_client('http://localhost:8080/WeixinDemo/UserInfoPort?wsdl', true);
//        $client->soap_defencoding = 'utf-8';
//        $client->decode_utf8 = false;
//        $client->xml_encoding = 'utf-8';
//
//        $param = array('arg0'=>'Joryun', 'arg1'=>'666666');//webservice引數陣列
//        $result = $client->call('ParameterTest', $param);//介面和引數
//        print_r($result);



        /**
         * php5自帶函式測試
         * classMap方式傳值
         */
        $client = new SoapClient("http://localhost:8080/WeixinDemo/UserInfoPort?wsdl");

        echo ("SOAP伺服器提供的開放Function:");
        echo '<pre>';
        var_dump ( $client->__getFunctions () );//獲取伺服器上提供的方法
        echo '</pre>';

        echo '<br>';

        echo ("SOAP伺服器提供的Type:");
        echo '<pre>';
        var_dump ( $client->__getTypes () );//獲取伺服器上資料型別
        echo '</pre>';

        $object=new stdclass;
        $object->arg0='Joryun';
        $object->arg1='666666';
        $result = $client->ParameterTest($object);
        //$result=get_object_vars($result);   //將object轉換為array
        var_dump($result);
    }
}

?>

總結

好了,今天的教程就說到這裡了<( ̄︶ ̄)>
當然了,之所以想分享是因為其中是有一些坑在,搞了一天多才搞定了。歡迎大家交流,有啥指導直說無妨哈哈哈哈~~

程式設計是一門事業。互勵共勉!!!