Webserviceリモートコール

17317 ワード

一、webserviceは何ですか.何ができますか.
(1)webserviceはhttpを用いてsoapプロトコルデータを送信するリモートコール技術である.
(2)wsdl:webservice description language(webサービス記述言語)は、xmlの形式でサービスがどこで、どのように呼び出されるかを説明する.
(3)soap:simple object access protocol(単純オブジェクトアクセスプロトコル)、httpプロトコルでxmlデータを転送する.
(4)sei:WebService EndPoint Interface(webサービス端末インタフェース)、2つの重要なクラス.
(4.1)@WebService:Webserviceインタフェースを定義します.
(4.2)@WebMethod:Webserviceの設定方法.
(4.3)@WebParam:Webserviceのパラメータを設定します.
(4.4)@WebResult:Webserviceの戻り値を設定します.
注意:
SOAP 12を使用するとwsimportとEclipseとWSExplorerが正常に使用できなくなり、cxfが提供するwsdl 2 javaツールを使用してローカルコードを生成する必要があります.
Webserviceのパフォーマンスは高くありません.
二、jdkが提供するクラスでwebserviceサービスを発表する
1、配布サービス側の実現
package com.cjh.service.impl;

import javax.jws.WebMethod;
import javax.jws.WebService;
import com.cjh.service.IUserService;
/**
 * SEI      
 * @author    
 *
 */
@WebService
public class UserServiceImpl implements IUserService{
	@Override
	public String queryUserName() {
		return "chen jia hao";
	}
	@WebMethod(exclude=true)
	@Override
	public String queryUserPassword() {
		return "123456";
	}
}
package com.cjh.provider;
import javax.xml.ws.Endpoint;
import com.cjh.service.impl.UserServiceImpl;

/**
 *     
 * @author    
 */
public class UserProvider {
	public static void main(String[] args) {
		Endpoint.publish("http://127.0.0.1:8080/user", new UserServiceImpl());
		System.out.println("userService publihser...");
	}
}


詳細:Endpoint.publish()は、プライマリ・スレッドの実行に影響を与えない新しいスレッドを開きます.
パブリッシュされたサービスには、少なくとも1つのパブリッシュ可能な方法が必要です.この方法は、静的またはfinalメソッドではありません.
@WebService注記をパブリッシュする必要があるサービスクラスで使用すると、Endpointがパブリッシュされたときにサービスクラスをアドレスに正しくバインドできます.
2、サービス呼び出し側実現
(1)jdkが持参するツールwsimportを使用する.exe(JAVA_HOME/bin内)は、対応するjavaクラスを生成します.
コマンドラインウィンドウコマンドラインウィンドウ:wximport-sを入力http://127.0.0.1:8080?wsdl.これによりクライアントjavaコードを生成できます.
 
オプションのパラメータ:
-d:生成する.classファイル.既定のパラメータ.
-s:生成されます.JAvaファイル.
-p-生成されたクラスを指定したパッケージの下に配置し、パッケージ構造をカスタマイズします.
wsdlurl :http://127.0.0.1:8080?wsdlを選択します.
webservice远程调用_第1张图片
package com.cjh.client;

import com.cjh.service.impl.UserServiceImpl;
import com.cjh.service.impl.UserServiceImplService;
/**
 *        
 * @author    
 *
 */
public class WebServiceClient {
	public static void main(String[] args) {
		UserServiceImplService userServiceImplService = new UserServiceImplService();
		UserServiceImpl userServiceImplPort = userServiceImplService.getUserServiceImplPort();
		System.out.println(userServiceImplPort.queryUserName());;
	}
}

リモートコール成功効果:
 
二、spring集積cxf webserviceリモートコールを実現
1、jarパッケージ準備:apache-cxf-2.7.18、ダウンロードアドレス:http://cxf.apache.org/download.html
2、web.xmlプロファイル:


  WebServiceProvider
  
      
        contextConfigLocation  
        classpath:config/spring-cxf.xml  
     
    
      
          
              org.springframework.web.context.ContextLoaderListener  
          
      
  
 	  
        CXFServlet  
          
               org.apache.cxf.transport.servlet.CXFServlet  
          
        1  
      
      
         CXFServlet  
         /*  
      
    
       
        
        encoding    
        org.springframework.web.filter.CharacterEncodingFilter    
            
            encoding    
            UTF-8    
            
            
            forceEncoding    
            true    
          
        
    
    	encoding
    	/
    
  
  
    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp
  


3、サービス側spring-cxfを発行する.xml構成で、露出するサービスインタフェースと呼び出しアドレスを構成します.


	
	
	
	
	

	
	
	
	
	
	
	


package com.cjh.service;

import javax.jws.WebService;
/**
 *         
 * @author    
 */
@WebService
public interface IUserService {
	public String queryUserName();
}
package com.cjh.service;

import javax.jws.WebService;

/**
 *           
 * @author    
 */
@WebService
public class UserServiceImpl implements IUserService{
	@Override
	public String queryUserName(){
		return "chen jia hao...";
	}
	
}

4、サービスコール先spring.xml構成で、リモートコールが必要なサービスとリモートサービスアドレスを構成します.



		
	  
	  
	  	


5、最後の呼び出し者は次のテストを行います.
package com.cjh.client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.cjh.service.IUserService;

/**
 *      
 * @author    
 *
 */
public class WebserviceClient {
	
	public static void main(String[] args) {
		
		ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:config/spring.xml");
		IUserService userService = (IUserService) classPathXmlApplicationContext.getBean("userService");
		System.out.println(userService.queryUserName());
	}
}

が表示されたら、おめでとうございます.リモートコールに成功しましたO(∩∩)O~. 
 
三、axis 2でwebserviceサービスを呼び出す
1、maven依存を導入する:

        
            org.apache.axis2
            axis2
            1.6.2
        
        
            org.apache.ws.commons.axiom
            axiom
            1.2.20
            pom
        
        
            org.apache.ws.commons.axiom
            axiom-api
            1.2.20
        
        
            org.apache.ws.commons.axiom
            axiom-impl
            1.2.20
        
        
            wsdl4j
            wsdl4j
            1.6.3
        
        
            org.apache.ws.xmlschema
            xmlschema-core
            2.2.3
        
        
            org.apache.neethi
            neethi
            3.1.1
        
        
            org.apache.axis2
            axis2-transport-local
            1.7.7
        
        
            org.apache.axis2
            axis2-transport-http
            1.7.7
        

        

2、キーコード実装(天気を呼び出すwebserviceを例に学習):
package com.cjh.test.webservice;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.junit.Test;

import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @author chen jia hao
 */
public class AxisTest {

    /***
     *     ,     webservice     
     * @throws AxisFault
     */
    @Test
    public void testRPCClient() throws AxisFault {
        try {
            //   RPC    WebService
            RPCServiceClient serviceClient = new RPCServiceClient();
            //   WSDL URL
            // String url = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl";
            String url = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx";
            //     WebService URL
            EndpointReference targetEPR = new EndpointReference(url);
            Options options = serviceClient.getOptions();
            //         
            options.setTo(targetEPR);
            //       (wsdl        (wsdl    targetNamespace)           )
            options.setAction("http://WebXml.com.cn/getWeather");

            //       
            // 1.namespaceURI -        (wsdl    targetNamespace)
            // 2.localPart -       (wsdl   operation     ,  )
            QName qname = new QName("http://WebXml.com.cn/", "getWeather");

            OMFactory omFactory = OMAbstractFactory.getOMFactory();
            OMNamespace omNamespace = omFactory.createOMNamespace("http://WebXml.com.cn/", "");
            //  
            OMElement method = omFactory.createOMElement("getWeather", omNamespace);
            //  
            OMElement theCityCode = omFactory.createOMElement("theCityCode", omNamespace);
            //      
            theCityCode.setText("  ");

            method.addChild(theCityCode);
            //method.build(); //  

            OMElement responseOMElement = serviceClient.sendReceive(method);
            System.out.println(responseOMElement);

            String hr = "-------------------------------------------------------";
            System.out.println(hr);
            System.out.println(hr);
            OMElement firstElement = responseOMElement.getFirstElement();
            Iterator childElements = firstElement.getChildElements();
            while (childElements.hasNext()) {
                OMElement element = (OMElement) childElements.next();
                System.out.println(element.getText());
                System.out.println(hr);
            }

        } catch (AxisFault e) {
            e.printStackTrace();
        }
    }

    /***
     *      WebServiceClient
     * @throws AxisFault
     */
    @Test
    public void test() throws AxisFault {

        String url = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx";
        String namespace = "http://WebXml.com.cn/";
        String method = "getWeather";
        Map params = new HashMap<>();
        params.put("theCityCode","  ");

        OMElement result = WebServiceClient.request(url, namespace, method, params);
        System.out.println(result);

        String hr = "-------------------------------------------------------";
        System.out.println(hr);
        System.out.println(hr);
        OMElement firstElement = result.getFirstElement();
        Iterator childElements = firstElement.getChildElements();
        while (childElements.hasNext()) {
            OMElement element = (OMElement) childElements.next();
            System.out.println(element.getText());
            System.out.println(hr);
        }
    }

}

/***
 * webservice        
 * @author chen jia hao
 */
class WebServiceClient {
    /***
     *     
     * @author chen jia hao
     * @param url
     * @param namespace
     * @param method
     * @param params
     * @return
     * @throws AxisFault
     */
    public static OMElement request(String url, String namespace, String method, Map params) throws AxisFault {

        assert (url!=null && namespace!=null && method!=null):"     null";

        String action = namespace + method;
        if (params == null) {
            params = new HashMap<>(0);
        }
        //   RPC    WebService
        RPCServiceClient serviceClient = new RPCServiceClient();
        //     WebService URL
        EndpointReference targetEPR = new EndpointReference(url);
        Options options = serviceClient.getOptions();
        //         
        options.setTo(targetEPR);
        //       (wsdl        (wsdl    targetNamespace)           )
        options.setAction(action);

        //       
        // 1.namespaceURI -        (wsdl    targetNamespace)
        // 2.localPart -       (wsdl   operation     ,  )
        //QName qname = new QName(namespace, method);
        OMFactory omFactory = OMAbstractFactory.getOMFactory();
        OMNamespace omNamespace = omFactory.createOMNamespace(namespace, "");
        //  
        OMElement methodElement = omFactory.createOMElement(method, omNamespace);
        for (Map.Entry item : params.entrySet()) {
            //  
            OMElement paramElement = omFactory.createOMElement(item.getKey(), omNamespace);
            //      
            paramElement.setText(item.getValue());
            methodElement.addChild(paramElement);
        }
        methodElement.build(); //  

        //    
        OMElement responseOMElement = serviceClient.sendReceive(methodElement);
        return responseOMElement;
    }

}

結果を返します.
webservice远程调用_第2张图片
 
 
参照先:1、2、3