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);
    }
}

?>

總結

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

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