JAva web serivceプローブ

8702 ワード

もう一つの神博文をパクリさせられたので、最初に原作のアドレスをお送りします
http://blog.csdn.net/qjyong/article/details/2148558
最近ウェブサービスを勉強しましたが、やはりすごいと思います.XMLに基づいているので、プラットフォームにまたがっているので、ファイアウォールにまたがる通信を実現するにはDCOMやaspページを書くのは面倒ですが、DCOMで具体的にどれだけ面倒なのかは分かりませんが、ネット上の水友によると、面倒ですが、ローカルエリアネットワークでDCOMや.NETTremotingを使うのは効率的で、aspの拡張性やメンテナンス性を書くのは低いということです.しかしXMLベースなので、伝送中に無駄なデータが大量に出てきますが、60%くらいです(ネット水友統計)簡単に言えばwebサービス=SOAP+HTTP+WSDL SOAPがSimple Object Access ProtocolでありXMLベースのSOAPの基本構造です
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
  ...
  ...
</soap:Header>
<soap:Body>
  ...
  ...
  <soap:Fault>
    ...
    ...
  </soap:Fault>
</soap:Body>
</soap:Envelope>

Envelopeはルート要素で、xmlns:soap属性の値は必ずhttp://www.w3.org/2001/12/soap-envelope soapのネーミングスペース
soap:encodingStyleは、ドキュメントで使用されるデータ型を表します.
xmlメッセージがsoapメッセージであることを示します
Header要素のactorプロパティは、soap情報を1つのブレークポイントから1つ以上の特定のエンドポイントに転送するために使用されます.
構文:soap:actor=「URL」
mustUnderstands属性は字面の意味から理解すればよい.
Body属性には実際に送信するメッセージが含まれています
このように,m:GetPriceとm:Itemはプログラムで定義される.
<soap:Body>   
   <m:GetPrice xmlns:m="http://www.jsoso.net/prices">   
      <m:Item>Apples</m:Item>   
   </m:GetPrice>   
</soap:Body> 
SOAP応答プロセス
SOAPリクエスト
POST /InStock HTTP/1.1  
Host: www.jsoso.net   
Content-Type: application/soap+xml; charset=utf-8  
Content-Length: XXX   
  
<? xml version="1.0"?>   
<soap:Envelope   
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">   
  <soap:Body xmlns:m="http://www.jsoso.net/stock">   
    <m:GetStockPrice>   
      <m:StockName>IBM</m:StockName>   
    </m:GetStockPrice>   
  </soap:Body>     
</soap:Envelope> 
SOAP応答
HTTP/1.1 200 OK   
Content-Type: application/soap+xml; charset=utf-8  
Content-Length: XXX   
  
<? xml version="1.0"?>   
<soap:Envelope   
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">   
  <soap:Body xmlns:m="http://www.jsoso.net/stock">   
    <m:GetStockPriceResponse>   
      <m:Price>34.5</m:Price>   
    </m:GetStockPriceResponse>   
  </soap:Body>     
</soap:Envelope>  

WSDLとは、Web Service Secript Languageというもので、ユーザーに詳細なWeb Serviceインタフェースの説明書を提供しています.
WSDLのドキュメントは一般的に長いです.普通は実写でも読まない.
<?xml version="1.0" encoding="UTF-8"?>
<definitions
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:tns="http://www.jsoso.com/wstest"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns="http://schemas.xmlsoap.org/wsdl/"
 targetNamespace="http://www.jsoso.com/wstest"
 name="Example">

<types>
  <xsd:schema>
  <xsd:import
   namespace="http://www.jsoso.com/wstest"
   schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
  </xsd:schema>
</types>

<message name="toSayHello">
  <part name="userName" type="xsd:string"></part>
</message>
<message name="toSayHelloResponse">
  <part name="returnWord" type="xsd:string"></part>
</message>

<message name="sayHello">
  <part name="person" type="tns:person"></part>
  <part name="arg1" type="xsd:string"></part>
</message>
<message name="sayHelloResponse">
  <part name="personList" type="tns:personArray"></part>
</message>
<message name="HelloException">
  <part name="fault" element="tns:HelloException"></part>
</message>

<portType name="Example">
  <operation name="toSayHello" parameterOrder="userName">
    <input message="tns:toSayHello"></input>
    <output message="tns:toSayHelloResponse"></output>
  </operation>
  <operation name="sayHello" parameterOrder="person arg1">
    <input message="tns:sayHello"></input>
    <output message="tns:sayHelloResponse"></output>
    <fault message="tns:HelloException" name="HelloException"></fault>
  </operation>
</portType>

<binding name="ExamplePortBinding" type="tns:Example">
  <soap:binding
    transport="http://schemas.xmlsoap.org/soap/http" 
    style="rpc"></soap:binding>
  <operation name="toSayHello">
    <soap:operation soapAction="sayHello"></soap:operation>
    <input>
      <soap:body use="literal"
        namespace="http://www.jsoso.com/wstest"></soap:body>
    </input>
    <output>
      <soap:body use="literal"
         namespace="http://www.jsoso.com/wstest"></soap:body>
    </output>
  </operation>
  <operation name="sayHello">
    <soap:operation soapAction="sayHello"></soap:operation>
    <input>
      <soap:body use="literal"
        namespace="http://www.jsoso.com/wstest"></soap:body>
    </input>
    <output>
      <soap:body use="literal"
        namespace="http://www.jsoso.com/wstest"></soap:body>
    </output>
    <fault name="HelloException">
      <soap:fault name="HelloException" use="literal"></soap:fault>
    </fault>
    </operation>
</binding>

<service name="Example">
  <port name="ExamplePort" binding="tns:ExamplePortBinding">
    <soap:address location="http://localhost:8080/hello"></soap:address>
  </port>
</service>
</definitions>
重要な要素がいくつかあります 
Message要素は、Webサービスの関数パラメータテーブルを定義します.
portTypeはwebサービスの関数体を定義する
bindingは伝送データの物理的実装を定義する
サービスはサービスアドレスをバインドしています
Java Web Service  JAvaではAnnotationというものでWebサービスを実現できます.ただしjavaがWebサービスを実装するBeanは、次の原則に従う必要があります.   このクラスはpublicクラスでなければなりません   これらのクラスはfinalまたはabstractではありません   このクラスには共通のデフォルト構造関数が必要です.   このクラスにはfinalize()メソッドが絶対に実装されてはいけません.まだ簡単なサービスです.
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class HellowWebService {
	private int num=0;
	@WebMethod(operationName="toSayHello",action="sayHello",exclude=false)
	public String sayHello(@WebParam(name="userName")String userName){
		num++;
		return "Hello:"+ userName+num;
	}
	
}
中@後ろのたくさんのものは実はWSDLの中のいくつかのものを定義しています.
パブリッシュクラス:
import java.util.LinkedList;
import java.util.List;

import javax.xml.ws.Binding;
import javax.xml.ws.Endpoint;
import javax.xml.ws.handler.Handler;


public class startService {
	public static void main(String[] args){
		HellowWebService serverBean = new HellowWebService();
		Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", serverBean);
		Binding binding = endpoint.getBinding();
		List<Handler> handlerChain = new LinkedList<Handler>();
		//handlerChain.add(new TraceHandler());
		binding.setHandlerChain(handlerChain);
		System.out.println("      http://localhost:8080/hello");
	}
}
このパブリケーションクラスを実行し、ブラウザで開きます.http://localhost:8080/hello?wsdl WSDLが見えます.
クライアント:
import com.jsoso.wstest.*;
public class client {
	public static void main(String[] args){
		Example_Service service = new Example_Service();
		Example server = service.getExamplePort();
		System.out.println(server.toSayHello("wyl"));
	}
}

クライアントにはwsimportコマンドを使用するクライアントフレームワークが必要です.これはJDKのコマンドであり、他の言語で作成されたサービスに適用されます.
wsimportの実行http://localhost:8080/hello?wsdl 2つのclassを生成し、この2つのclassをクライアントに導くと、クライアントが実行できます.