亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

技巧:用 JAXM 發送和接收 SOAP 消息

2019-11-18 15:07:35
字體:
來源:轉載
供稿:網友

在本篇技巧文章中,作者兼開發人員 Nicholas Chase 向您演示如何使用用于 xml 消息傳遞的 java API(Java API for XML Messaging (JAXM))簡化創建和發送 SOAP 消息的過程。
Web 服務的基礎在于以標準格式發送和接收消息以便使所有系統都能理解。通常,那種格式是簡單對象訪問協議(Simple Object access PRotocol (SOAP))。SOAP 消息可以手工生成和發送,但是用于 XML 消息傳遞的 Java API(JAXM)使許多必需步驟(如創建連接或創建并發送實際消息)自動化。這篇技巧文章記錄了一個同步 SOAP 消息的創建和發送。

這個過程包含五個步驟:

創建 SOAP 連接
創建 SOAP 消息
填充消息
發送消息
檢索應答
JAXM 可以作為 Java XML Pack(2002 年春季版)的一部分和 Java Web Services Developer Pack EA2(請參閱參考資料)的一部分而獲得。后者還包含了一份 Tomcat Web 服務器以及樣本應用程序的副本。那些樣本 Web 服務之一作為本技巧文章中 SOAP 消息的目的地,這個例子中實際服務的內容和功能卻不是很重要。

SOAP 消息結構
一個基本的 SOAP 消息由包含兩個主要部分(報頭和主體)的封套組成。應用程序決定如何使用這些部分,但整個消息必須遵循特定的 XML 結構,例如:

樣本 SOAP 消息
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header/>
<soap-env:Body>
<cal:schedule xmlns:cal="http://www.example.com/calendar">
<cal:newitem>
<cal:eventDate>4/10/2002</cal:eventDate>
<cal:title>Fun With Frogs</cal:title>
</cal:newitem>
</cal:schedule>
</soap-env:Body>
</soap-env:Envelope>

在這個例子中,報頭為空,而主體包含目的地為一個日歷應用程序的信息。

請注重這個消息的結構。Envelope 包含 Header 和 Body 元素,而三者全都是 http://schemas.xmlsoap.org/soap/envelope/ 名稱空間的一部分。整個消息將通過一個 SOAP 連接發送到一個 Web 服務中。

創建連接和消息
第一步是創建整個類和連接:

創建連接
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;

public class SOAPTip {

public static void main(String args[]) {

try {

//First create the connection
SOAPConnectionFactory soapConnFactory =
SOAPConnectionFactory.newInstance();
SOAPConnection connection =
soapConnFactory.createConnection();

//Close the connection
connection.close();

} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

SOAP 消息可以通過使用 SOAPConnection 直接發送,或使用消息傳遞提供程序間接發送。在這個例子中,應用程序通過使用工廠(factory)創建 SOAPConnection 對象。

工廠也創建消息本身:

創建消息對象
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPBody;

public class SOAPTip {

public static void main(String args[]) {

try {

//First create the connection
SOAPConnectionFactory soapConnFactory =
SOAPConnectionFactory.newInstance();
SOAPConnection connection =
soapConnFactory.createConnection();

//Next, create the actual message
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();

//Create objects for the message parts
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();

//Close the connection
connection.close();

} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

首先,通過使用 MessageFactory 來創建消息本身。這個消息已包含如 envelope 和 header 等基本部分的空白版本。SOAPPart 包含 envelope,而 envelope 包含主體。同時創建所需對象(如 SOAPBody)的引用。

接著,填充 SOAPBody:

填充主體
...
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;

public class SOAPTip {

public static void main(String args[]) {

try {
...
//Create objects for the message parts
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();

//Populate the body
//Create the main element and namespace
SOAPElement bodyElement =
body.addChildElement(envelope.createName("schedule" ,
"cal",
"http://www.example.com/calendar"));
//Add content
bodyElement.addChildElement("cal:newitem").addTextNode("contentHere");

//Save the message
message.saveChanges();

//Check the input
System.out.println(" REQUEST: ");
message.writeTo(System.out);
System.out.println();

//Close the connection
connection.close();

} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

SOAP 消息的主體就象任何其它 XML 元素,您可以在其中添加子元素(如 schedule 元素)。通常,您可以使用 addChildElement(elementname),但是這里演示的 envelope.createName() 方法使用用于數據或有效負載的名稱空間聲明簡化了元素的創建。的確,創建 schedule 元素從而創建了 bodyElement SOAPElement 對象。然后,bodyElement 對象可以給其自己的子元素 cal:newitem 添加其自己的文本節點。通過這種方式,您可以象構建任何其它 XML 文檔一樣構建 XML 結構。

然而,使用 JAXM,您也有機會通過使用外部文件直接創建消息的 SOAPPart。例如,第一個清單中的 XML 結構保存在文件 prepped.msg 中,而且可以調用它來替代手工構建文檔。

從外部文件創建消息
...
import javax.xml.soap.SOAPElement;

import java.io.FileInputStream;
import javax.xml.transform.stream.StreamSource;

public class SOAPTip {

public static void main(String args[]) {
...
//Create objects for the message parts
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();

//Populate the Message
StreamSource preppedMsgSrc = new StreamSource(
new FileInputStream("prepped.msg"));
soapPart.setContent(preppedMsgSrc);

//Save the message
message.saveChanges();
...
}
}

結果就是預備發送的 SOAP 消息。

發送消息
對于同步消息,發送 SOAP 消息和接收應答是在單個步驟中發生的:

發送消息
...
import javax.xml.messaging.URLEndpoint;

public class SOAPTip {

public static void main(String args[]) {

...
//Check the input
System.out.println(" REQUEST: ");
message.writeTo(System.out);
System.out.println();

//Send the message and get a reply

//Set the destination
URLEndpoint destination =
new URLEndpoint("http://localhost:8080/jaxm-simple/receiver");
//Send the message
SOAPMessage reply = connection.call(message, destination);

//Close the connection
connection.close();
...
}
}

實際的消息是使用 call() 方法發送的,該方法把消息本身和目的地作為參數,然后返回第二個 SOAPMessage 作為應答。目的地必須是一個 Endpoint 對象,或者是這個例子中的 URLEndpoint。這個示例使用來自 JWSDP 的一個樣本 servlet,它只用于獲取響應。

call() 方法一直處于阻塞狀態,直到它接收到返回的 SOAPMessage 為止。

響應
返回的 SOAPMessage ? reply ? 是 SOAP 消息,它與已發送的消息格式相同,因此可以象操作任何其它 XML 消息那樣操作它。SOAP 答應您通過使用 XSLT 直接轉換應答:

讀取響應
...
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.Source;

import javax.xml.transform.stream.StreamResult;

public class SOAPTip {

public static void main(String args[]) {

try {

...
//Send the message
SOAPMessage reply = connection.call(message, destination);

//Check the output
System.out.println(" RESPONSE: ");
//Create the transformer
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
Transformer transformer =
transformerFactory.newTransformer();
//Extract the content of the reply
Source sourceContent = reply.getSOAPPart().getContent();
//Set the output for the transformation
StreamResult result = new StreamResult(System.out);
transformer.transform(sourceContent, result);
System.out.println();

//Close the connection
connection.close();
...
}
}

象在任何 XSLT 應用程序中那樣創建 Transformer 對象。在這個例子中,我們只希望輸出內容,所以沒有用到樣式表。這里,內容本身就是消息的整個 SOAP 部分(與可能包含附件的 SOAP 消息本身不同)。您還可以在處理之前抽取封套和主體。這個例子中的結果只是 System.out,但它可以是通常用于轉換的任何選擇。照常進行轉換。

圖 1. SOAP 請求和響應

下一步
雖然本示例中的端點是提供靜態響應的 servlet,但是實際的響應取決于服務的功能和請求的性質。同時,雖然本篇技巧文章演示了消息的同步發送和接收,但是通過使用 ProviderConnection 對象而不是 SOAPConnection,JAXM 答應使用消息傳遞提供程序進行異步發送。該提供程序一直保存這個消息,直到成功發送消息為止。

JAXM 還答應使用 profile,這樣很輕易創建諸如 SOAP-RP 或 ebXML 消息那樣的專門 SOAP 消息,而且還能使非 XML 附件能夠附加到 SOAP 消息中。

參考資料

請查看 W3C 中的各種與 Web 服務相關的建議書的情況。
JAXM 可以作為 Java XML Pack(2002 年春季版)的一部分和 Java Web Services Developer Pack EA2 的一部分而獲得。
IBM WebSphere Studio application Developer 是用于構建、測試和部署 Web 服務的易用的集成開發環境。
要獲取完整的 Web 服務工具箱,請下載 IBM 的 Web Services Development Kit。
在 developerWorks 的 XML 和 Web 服務專區查找更多參考資料。

關于作者
Nicholas Chase 一直在參與如 LUCent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers 等公司的網站開發。Nick 曾經是一位高中物理教師、低級放射性廢物設備的治理員、在線科幻小說雜志的編輯、多媒體工程師和 Oracle 講師。近來,他是佛羅里達州克利爾沃特 Site Dynamics Interactive Communications 的首席技術官,而且是有關 Web 開發的三本書,包括 Java and XML From Scratch(Que)和即將出版的 Primer Plus XML Programming(Sams)的作者。他愿意傾聽讀者的意見,可以通過 nicholas@nicholaschase.com 與他聯系。

--摘自IBM網站
http://www-900.ibm.com/developerWorks/cn/xml/tips/x-jaxmsoap/index.sHtml

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品人成电影在线观看| 亚洲一级一级97网| 国产精品免费一区豆花| 国产精品偷伦视频免费观看国产| 一区国产精品视频| 国产精品久久久久久久久久| 亚洲人成网站999久久久综合| 成人网在线观看| 日韩av电影在线网| 日韩av在线免费| 欧美三级欧美成人高清www| 日韩成人高清在线| 久久天天躁夜夜躁狠狠躁2022| 日韩在线激情视频| 最近免费中文字幕视频2019| 原创国产精品91| 国产精品欧美一区二区三区奶水| 高跟丝袜一区二区三区| 久久成人av网站| 久久国产精品偷| 日本亚洲欧美成人| 色综合老司机第九色激情| 精品无人国产偷自产在线| 精品国产乱码久久久久久天美| 欧美亚洲国产视频小说| 成人av在线天堂| 国产视频福利一区| 精品无人国产偷自产在线| 91九色国产社区在线观看| 欧美日韩亚洲精品一区二区三区| 欧美猛少妇色xxxxx| 清纯唯美亚洲激情| 亚洲精品国精品久久99热一| 欧美日韩国产丝袜另类| 国产午夜精品理论片a级探花| 国产精品色视频| 欧美激情按摩在线| 高清欧美性猛交xxxx| 九九热视频这里只有精品| 久久99热精品这里久久精品| 久久97精品久久久久久久不卡| 国产丝袜一区二区三区免费视频| 欧美午夜性色大片在线观看| 国产精品美女午夜av| 亚洲深夜福利网站| 久99九色视频在线观看| 欧美成人午夜激情视频| 欧美黑人极品猛少妇色xxxxx| 国产美女精彩久久| 亚洲图片在线综合| 欧美国产高跟鞋裸体秀xxxhd| 日韩在线欧美在线国产在线| 欧美另类69精品久久久久9999| 久久久av亚洲男天堂| 久久久久久亚洲| 亚洲精品国产拍免费91在线| 色悠久久久久综合先锋影音下载| 欧美激情在线狂野欧美精品| 久久久极品av| 亚洲国产欧美在线成人app| 色在人av网站天堂精品| 4438全国亚洲精品在线观看视频| 亚洲第一区第一页| 欧美日韩亚洲高清| 美女999久久久精品视频| 日韩av在线免费播放| 亚洲www在线| 欧美高清视频一区二区| 久久久久亚洲精品成人网小说| 亚洲成人av资源网| 中文日韩在线观看| 欧美亚洲在线播放| 国产精品旅馆在线| 欧美激情视频三区| 国产精品成av人在线视午夜片| 欧美成在线观看| 午夜精品理论片| 亚洲国产欧美精品| 欧美国产视频日韩| 日韩在线播放一区| 在线观看日韩av| 66m—66摸成人免费视频| 97久久精品人人澡人人爽缅北| 91国产精品视频在线| 久久久欧美精品| 国产精品成人一区| 亚洲欧美一区二区三区四区| 亚洲第一av网站| 国产色综合天天综合网| 国产午夜精品全部视频在线播放| 深夜福利日韩在线看| 久久福利视频导航| 中日韩美女免费视频网站在线观看| 91久久综合亚洲鲁鲁五月天| 欧美激情亚洲精品| 最近2019免费中文字幕视频三| 久久久久亚洲精品成人网小说| 国产成人高潮免费观看精品| 亚洲精品日韩激情在线电影| 欧美日韩在线视频一区| 国产一区二区在线播放| 91免费国产视频| 国产精品视频一区二区三区四| 在线成人免费网站| 久久99热精品这里久久精品| 国产精品一区久久| 亚洲成色999久久网站| 日韩高清电影免费观看完整| 久久久电影免费观看完整版| 国产精品高清在线观看| 日韩美女在线播放| 欧洲精品久久久| 国产91在线播放九色快色| 91禁外国网站| 久久精品成人欧美大片| 欧美巨大黑人极品精男| 日本精品久久中文字幕佐佐木| 日韩av在线一区| 欧美精品久久久久a| 国产精品亚洲激情| 日本国产高清不卡| 欧美精品少妇videofree| 国产97在线视频| 欧美大片va欧美在线播放| 在线观看日韩www视频免费| 欧美亚洲另类视频| 精品视频久久久久久| 成人国产精品久久久| 国产成一区二区| 亚洲人成电影网站色…| 精品久久久久人成| 91夜夜揉人人捏人人添红杏| 精品国产区一区二区三区在线观看| 久久精品中文字幕| 久久国产色av| 欧日韩不卡在线视频| 欧美国产日韩免费| 欧美激情xxxx性bbbb| 久久久久国色av免费观看性色| 亚洲天堂网站在线观看视频| 久久人人爽人人爽爽久久| 精品调教chinesegay| 高跟丝袜欧美一区| 亚洲欧美国产视频| 久久亚洲私人国产精品va| 久久视频在线直播| 欧美中在线观看| 精品亚洲永久免费精品| 亚洲美女又黄又爽在线观看| 亚洲老板91色精品久久| 日韩亚洲第一页| 国产91免费看片| 91在线|亚洲| 这里只有视频精品| 亚洲国产精品免费| 欧美日韩福利电影| 国产成人精品一区二区三区| 亚洲永久在线观看| 欧美午夜精品在线| 一个人看的www久久| 日本韩国欧美精品大片卡二| 午夜精品一区二区三区在线视频| 中文字幕欧美精品在线| 亚洲最大成人网色|