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の基本構造です
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リクエスト
WSDLとは、Web Service Secript Languageというもので、ユーザーに詳細なWeb Serviceインタフェースの説明書を提供しています.
WSDLのドキュメントは一般的に長いです.普通は実写でも読まない.
Message要素は、Webサービスの関数パラメータテーブルを定義します.
portTypeはwebサービスの関数体を定義する
bindingは伝送データの物理的実装を定義する
サービスはサービスアドレスをバインドしています
Java Web Service JAvaではAnnotationというものでWebサービスを実現できます.ただしjavaがWebサービスを実装するBeanは、次の原則に従う必要があります. このクラスはpublicクラスでなければなりません これらのクラスはfinalまたはabstractではありません このクラスには共通のデフォルト構造関数が必要です. このクラスにはfinalize()メソッドが絶対に実装されてはいけません.まだ簡単なサービスです.
パブリッシュクラス:
クライアント:
クライアントにはwsimportコマンドを使用するクライアントフレームワークが必要です.これはJDKのコマンドであり、他の言語で作成されたサービスに適用されます.
wsimportの実行http://localhost:8080/hello?wsdl 2つのclassを生成し、この2つのclassをクライアントに導くと、クライアントが実行できます.
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をクライアントに導くと、クライアントが実行できます.