[Java 基礎]--呼叫webservice介面的方法

highfei2011發表於2015-07-28

通常訪問webservice有三種方法

  • 測試時使用
  • Call訪問
  • 直接Client訪問

第二種和第三種最常用的,獻上程式碼:

介面裡面的方法有2個:
1、public Student addStudent(Student stu)throws Exception;
2、public Student removeStu(int id)throws Exception;

一、在webservice專案中測試使用

package test;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import service.interfaces.MyService;
import bean.Student;

public class TestClient {
/**
 * @函式功能說明 :測試訪問是否成功!
 * @修改者名字:yang
 * @修改日期 : 2015-7-28 
 * @修改內容 :
 * @引數: @param args   
 * @return void   
 * @throws
 */
	public static void main(String[] args) {
		//這裡是建立一個service,需要傳入一個介面類,因為我們後面必須呼叫相應的介面方法
		Service srcModel = new ObjectServiceFactory().create(MdServer.class);
		//建立代理工廠,這裡是為了後面建立相應的介面類
		XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
		//webservice地址,不需要加wsdl,只是部署在tomcat上以後,通過位址列訪問時,可以新增?wsdl
		//比如:http://localhost:8080/MyService/services/MyService?wsdl
		String RectServiceUrl = "http://localhost:8080/MyService/services/MyService";//設定訪問路徑,固定結構
		/http://ip地址/專案名/services/專案名
		try {
			//利用工廠返回相應的介面類
			MyService ms = (MyService)factory.create(srcModel,RectServiceUrl);
			//呼叫介面裡面的方法
			//新增一個學生物件
			Student st=new Student(null,"張三","北京海淀區",0);//預設為0,新增成功或者刪除成功後,修改為1
		    Student result=ms.addStudent(st);
		    System.out.println("接收新增後的學生物件:"+result);//實際是webService介面的返回值
			
			//刪除一個學生物件
			Student result2=ms.removeStu(22);
			System.out.println("接收刪除後的學生物件:"+result2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

二、在另一個專案中呼叫部署在伺服器上的介面(實際上部署的是war包)

記得匯入架包:
axis-1_4 http://download.csdn.net/download/xiaoyong8823/4391971

package test;

import javax.servlet.http.HttpServletResponse;
import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

import org.junit.Test;
import bean.Student;
/**
 * @函式功能說明 :測試訪問是否成功!
 * @修改者名字:yang
 * @修改日期 : 2015-7-28 
 * @修改內容 :
 * @引數: @param args   
 * @return void   
 * @throws
 */

public class TestCall {
    @Test
	//測試新增一個學生物件
	public String xslsAdd(){
		String str="";
		try{
			//webservice介面地址,一般是別人提供
			String endPoint="http://localhost:8080/MyService/services/MyService";
			//建立服務物件
			Service service=new Service();
			Call call=(Call)service.createCall();
			call.setTargetEndpointAddress(endPoint);
			//呼叫介面名稱
			call.setOperationName("addStudent");//測試新增一個學生物件的介面方法
			call.addParameter("id", XMLType.XSD_INTEGER,ParameterMode.IN );
			call.addParameter("name", XMLType.XSD_STRING,ParameterMode.IN );
			call.addParameter("address",XMLType.XSD_STRING,ParameterMode.IN );
			call.addParameter("status",XMLType.XSD_INT,ParameterMode.IN );
		
	       /** 
             * 設定返回值型別-由於返回一個代理類SendExResp-這個需要用ws工具生成,不然就要手動寫, 
             * 故這裡設定成org.w3c.dom.Element.class,不然會報org.xml.sax.SAXException: 
             * SimpleDeserializer   encountered a child element, which is NOT expected錯誤。 
             * 注:具體的返回型別,根據對方提供的ws進行設定即可,如:call.setReturnClass(String[].class); 
             */  
			call.setReturnClass(org.w3c.dom.Element.class); 
			//設定引數,在實際中,通過接受頁面傳遞的引數
			Integer  id=null;
			String name="張三";
			String address="北京海淀區";
			String status=0;
	        
		    // 此處是為了解決錯誤:伺服器未能識別 HTTP 頭 SOAPAction 的值 而重新設定介面方法(可要可不要)
            call.setUseSOAPAction(true);  
            //設定返回值型別是String型別,如果是物件型別,那麼需要使用w3cl的規範
            call.setReturnClass(String.class);
            call.setSOAPActionURI("addStudent");  
            // 呼叫ws方法 
            //如果想得到webService方法返回的結果:需要寫一個配置檔案,生成類,放到工程下面(我的例子中,暫時未講)
            Student result=(Student)call.invoke("addStudent",new Object[]{id,name,address,status});
         System.out.println("學生物件新增結果,輸出是否成功:"+result);//輸出為空,原因是,工程中未新增相應配置檔案
			str="addSuccess";
		}catch(Exception e){
			e.printStackTrace();
			return "addError";
		}
		return str;
	}

三、Client訪問方式

1、新建一個java project專案
2、新增架包Xfire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries
3、建立測試類

package com.testStudentServer;

import java.net.URL;

import org.codehaus.xfire.client.Client;
import org.junit.Test;
import org.w3c.dom.Document;

public class TestClient {
	@Test
	public void testAddXsls() throws Exception{
		Client client =new Client(new URL("http://localhost:8080/MyService/services/MyService?wsdl"));
		Object[] results=client.invoke("addStudent", new Object[]{null,"張三","北京海淀區",0});
		System.out.println("新增結果:"+results[0]);
		//處理返回結果
		Document d=(Document)results[0];
	       System.out.println(d.getFirstChild().getFirstChild().getNodeValue());
	      /*	檢視返回的結果處理方法
	       System.out.println("結果2:===="+d.getFirstChild());
		NodeList n1=d.getElementsByTagName("addStudent");
		NodeList n2=n1.item(0).getChildNodes();
		System.out.println("長度:"+n2.getLength());
		for(int i=0;i<n2.getLength();i++){
			System.out.println(n2.item(i).getNodeName()+"==="+n2.item(i).getTextContent());
		}
		*/
	}
}

以上三段程式碼都經過測試,可以正常使用!如有疑問,請留言指正!

相關文章