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、配布サービス側の実現
詳細: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を選択します.
リモートコール成功効果:
二、spring集積cxf webserviceリモートコールを実現
1、jarパッケージ準備:apache-cxf-2.7.18、ダウンロードアドレス:http://cxf.apache.org/download.html
2、web.xmlプロファイル:
3、サービス側spring-cxfを発行する.xml構成で、露出するサービスインタフェースと呼び出しアドレスを構成します.
4、サービスコール先spring.xml構成で、リモートコールが必要なサービスとリモートサービスアドレスを構成します.
5、最後の呼び出し者は次のテストを行います.
が表示されたら、おめでとうございます.リモートコールに成功しましたO(∩∩)O~.
三、axis 2でwebserviceサービスを呼び出す
1、maven依存を導入する:
2、キーコード実装(天気を呼び出すwebserviceを例に学習):
結果を返します.
参照先:1、2、3
(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を選択します.
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;
}
}
結果を返します.
参照先:1、2、3