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

首頁 > 學院 > 開發(fā)設計 > 正文

技巧:用 JAXM 發(fā)送和接收 SOAP 消息

2019-11-18 15:07:35
字體:
供稿:網(wǎng)友

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

這個過程包含五個步驟:

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

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

樣本 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>

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

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

創(chuàng)建連接和消息
第一步是創(chuàng)建整個類和連接:

創(chuàng)建連接
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 直接發(fā)送,或使用消息傳遞提供程序間接發(fā)送。在這個例子中,應用程序通過使用工廠(factory)創(chuàng)建 SOAPConnection 對象。

工廠也創(chuàng)建消息本身:

創(chuàng)建消息對象
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 來創(chuàng)建消息本身。這個消息已包含如 envelope 和 header 等基本部分的空白版本。SOAPPart 包含 envelope,而 envelope 包含主體。同時創(chuàng)建所需對象(如 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() 方法使用用于數(shù)據(jù)或有效負載的名稱空間聲明簡化了元素的創(chuàng)建。的確,創(chuàng)建 schedule 元素從而創(chuàng)建了 bodyElement SOAPElement 對象。然后,bodyElement 對象可以給其自己的子元素 cal:newitem 添加其自己的文本節(jié)點。通過這種方式,您可以象構(gòu)建任何其它 XML 文檔一樣構(gòu)建 XML 結(jié)構(gòu)。

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

從外部文件創(chuàng)建消息
...
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();
...
}
}

結(jié)果就是預備發(fā)送的 SOAP 消息。

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

發(fā)送消息
...
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() 方法發(fā)送的,該方法把消息本身和目的地作為參數(shù),然后返回第二個 SOAPMessage 作為應答。目的地必須是一個 Endpoint 對象,或者是這個例子中的 URLEndpoint。這個示例使用來自 JWSDP 的一個樣本 servlet,它只用于獲取響應。

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

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

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

圖 1. SOAP 請求和響應

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

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

參考資料

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

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
无人区在线高清完整免费版 一区二| 色爱综合网站| 久久国内精品自在自线400部| 国产精品jizz在线观看老狼| 中文字幕av在线免费观看| 久久久久久久久久码影片| 丁香啪啪综合成人亚洲小说| 蜜桃av一区二区在线观看| 欧美在线关看| 欧美日韩成人在线一区| 欧美视频在线观看| 欧美极品另类videosde| 久久超碰亚洲| 精品国产成人| 欧美在线观看视频在线| 精品国产一区二区三区忘忧草| 亚洲国产欧美在线观看| 亚洲精品色午夜无码专区日韩| 国产精品亚洲第一区| 在线不卡一区二区| 亚洲丝袜精品| 亚洲精品白浆高清久久久久久| 精品1区2区3区4区| 欧美中文一区二区三区| 国产精欧美一区二区三区| 中文字幕精品网| 国内外免费激情视频| 亚洲国产精品久久久久秋霞蜜臀| 茄子视频成人免费观看| 男男做性免费视频网| 欧美高清www午色夜在线视频| 圆产精品久久久久久久久久久| 高清视频国产| 成人在线视频亚洲| 久久久久亚洲AV成人| 国产日韩精品一区二区| 欧美一区深夜视频| 国产三级三级三级精品8ⅰ区| 北条麻妃av高潮尖叫在线观看| 国产精品高潮呻吟久久av黑人| 亚洲国产毛片aaaaa无费看| 亚洲国语精品自产拍在线观看| 精品福利视频一区二区三区| 亚洲国产精品综合久久久| 亚洲一区成人| 色999国产精品| 亚洲人午夜精品| 日韩欧美高清dvd碟片| 俄罗斯xxxx性全过程| 激情综合网婷婷| 亚洲第一区在线| 天堂在线中文字幕| 久久久久久一级片| 涩涩视频在线观看下载| 成人在线tv视频| 国产一卡不卡| 国产亚洲第一页| 亚洲成熟女性毛茸茸| 偷拍一区二区| 免费91视频| 纪美影视在线观看电视版使用方法| 国产日韩av网站| 亚洲午夜日本在线观看| 色琪琪一区二区三区亚洲区| 一线天粉嫩在线播放| 欧美视频日韩视频| 91偷拍精品一区二区三区| 992tv成人免费影院| 一本色道无码道dvd在线观看| 日韩在线一区二区三区四区| 精品国产伦一区二区三区观看说明| 91.·福利| 久久久久九九九九| 91蜜桃网址入口| 亚洲日本丝袜连裤袜办公室| 精品福利视频导航| 久久亚洲春色中文字幕久久久| 免费毛片一区二区三区| 中文字幕日韩在线| 一道本在线观看视频| 日韩美女av在线免费观看| 伊人成综合网站| 欧美色电影在线| 天堂在线资源库| av第一福利在线导航| 久久久91精品国产一区不卡| 色偷偷亚洲男人天堂| 精品国产污污免费网站入口| 欧美成人激情免费网| 亚洲欧美综合精品久久成人| 国产一区二区三区成人欧美日韩在线观看| 国产欧美亚洲精品a| www.国产自拍| 日韩手机在线导航| 日本免费在线播放| 丰满岳乱妇一区二区| 日本高清视频一区二区三区| 欧美野外多人交3| 亚洲伦理在线| 国产美女高潮一区二区三区| 精品成人久久av| 国产大尺度在线观看| 精品日产乱码久久久久久仙踪林| 国产精品国产三级国产专区51| 国产一区二区精品福利地址| 久蕉依人在线视频| 欧美色爱综合| 久久免费偷拍视频| 99精品国产99久久久久久白柏| 亚洲综合激情六月婷婷在线观看| 一本一本久久| 欧美日韩视频精品一区二区| 人妻内射一区二区在线视频| 日本免费a视频| 亚洲成人国产综合| 邻家有女韩剧在线观看国语| av成人 com a| 国产污视频在线看| 99精品视频中文字幕| 国模吧一区二区三区| 欧美野外多人交3| 免费看特级毛片| 国产成人精品一区二区在线小狼| 亚洲影院久久精品| 丝袜国产免费观看| 国产三级三级三级精品8ⅰ区| 69久久精品无码一区二区| 亚洲第一二区| 国产精品久久久久久久久鸭| jizz亚洲| 国产片一区二区| 日本中文字幕网址| eeuss国产一区二区三区四区| 在线欧美一级视频| 欧美成人影院在线播放| 欧美大片免费观看在线观看网站推荐| 激情五月婷婷六月| 91黄视频在线| 精品一区在线播放| www.欧美国产| 熟妇人妻av无码一区二区三区| 色久综合一二码| 成a人片亚洲日本久久| 国产丝袜美腿一区二区三区| 午夜av噜噜噜噜噜噜| 国产精品影视在线| 国产精品久久久久毛片软件| 国产69精品久久久久孕妇| 精品视频一二三| 2022国产精品| 日韩人体视频一二区| 欧美成人免费在线观看视频| 精品乱子伦一区二区| 外卖gayxxxxgay1| 成人做爰www免费看视频网站| dy888午夜| 国产色视频一区二区三区qq号| 午夜精品影院在线观看| 欧美国产一二三区| 在线看成人av| 久草福利在线观看| 午夜久久久久久噜噜噜噜| 激情五月亚洲色图| 欧美成人国产一区二区| 成人综合网址| 亚洲精品第一国产综合精品| 亚洲精品77777| 国产精品一区二区三区四区色| 日日噜噜夜夜狠狠| 亚洲色图另类小说| 亚洲国产精品一区二区久久| 婷婷亚洲久悠悠色悠在线播放| 影音先锋成人在线电影| 亚洲三区视频| 欧美色偷偷大香| 在线观看入口黄最新永久免费国产| 香蕉在线播放| 国产精品久久久久久久久久ktv| 自拍偷拍在线视频| 久久久久免费看黄a片app| 久久99偷拍| 中国美女乱淫免费看视频| 国产精品美女久久久久人| 国产91精品看黄网站在线观看| 韩国黄色一级大片| 一区二区在线观看免费视频播放| 3d动漫啪啪精品一区二区免费| 中韩乱幕日产无线码一区| 欧美粗暴jizz性欧美20| 日本在线电影一区二区三区| 欧美日韩1080p| 色综合视频二区偷拍在线| 女生裸体无遮挡天堂网站免费| 久久久久久一级片| 91论坛在线播放| 精品一区二区三孕妇视频| 一区精品在线| 成人精品一二三区| 精品一成人岛国片在线观看| 一本色道久久综合亚洲精品酒店| 色播五月激情综合网| 欧美日韩欧美| 日韩午夜中文字幕| 一插菊花综合| 在线观看黄色av网站| 久久精品欧美| 日本黄色片一级片| 欧美国产成人精品一区二区三区| 在线电影一区二区三区| 国产一区二区免费| 欧美黄色一区二区三区| 久久99亚洲精品| 久久黄色影视| www插插插无码视频网站| 国产精品妹子av| av在线收看| 日本中文字幕在线不卡| 国产在线精品一区二区中文| 极品颜值美女露脸啪啪| 国产精品免费无遮挡无码永久视频| 久久久久久久久伊人| 99精品全国免费观看| 欧美成人自拍| 精品久久九九| 伊人精品在线| 亚洲精品视频播放| 亚洲第一久久影院| 三级av在线播放| 97在线免费观看| 精品一区二区三区在线视频| 亚洲高清不卡av| jizz亚洲| 最新国产精品拍自在线播放| 亚洲欧美自偷自拍另类| 女教师高潮黄又色视频| 自拍偷拍亚洲天堂| 高清国产mv在线观看| 久久久久久高潮国产精品视| 一区在线免费| 日韩午夜黄色| 亚洲一区二区视频在线观看| 欧美少妇xxx| 亚洲成人一品| 国产精品mv在线观看| 国产精品免费成人| 国产蜜臀97一区二区三区| 69视频在线观看免费| 精品国产sm最大网站| 人狥杂交一区欧美二区| 制服丝袜亚洲播放| 7m第一福利500精品视频| 久久精品国产亚洲777| 天堂精品在线视频| 给我免费播放片在线观看| 无需播放器亚洲| 婷婷色在线播放| av日韩在线播放| 青青草av在线播放| 青青青国产在线视频| 波多野结衣在线网站| 亚洲国产成人精品电影| 欧美大片免费观看在线观看网站推荐| 亚洲成人黄色网址| 欧美卡一卡二卡三| 成年人黄色网址| 国产成人短视频| 日韩欧美在线视频日韩欧美在线视频| 中文字幕亚洲乱码熟女1区2区| 五月天久久比比资源色| 久久综合久久久久| 亚洲第一网站免费视频| 色综合天天综合色综合av| 国产精品香蕉视屏| 亚洲蜜桃精久久久久久久久久久久| 手机看片国产1024| 亚洲欧美成人精品| 91福利国产成人精品照片| 国产绿帽刺激高潮对白| 中文字幕一区二区三区在线不卡| 一二三区免费视频| 久久偷窥视频| 成人手机在线免费视频| 国产欧美欧美| 精品国产大片大片大片| 尤物视频最新网址| 日本福利片免费看| fc2人成共享视频在线观看| 五月天激情开心网| 视频国产精品| 老熟妇高潮一区二区三区| 国产羞羞视频在线观看| 蜜桃久久一区二区三区| 91精品久久久| 精品一区二区三区香蕉蜜桃| 女同另类激情重口| 成视频在线免费观看| 欧美一级爽aaaaa大片| 欧美禁忌电影| 国产精品久久久久av福利动漫| 国产精品一区2区3区| 精品免费视频| 色综合五月婷婷| 51ⅴ精品国产91久久久久久| 亚洲综合视频一区| 久久久久久国产精品美女| 狠狠色噜噜狠狠狠888奇米| 精品视频导航| 影视先锋久久| 欧美xxxx日本和非洲| xxxx性bbbb欧美野外| 人人狠狠综合久久亚洲婷| 成人免费网站视频| 免费h在线看| 亚洲欧洲日韩国产| 成人18视频在线播放| 一区二区三区四区五区视频在线观看| 亚洲精品自拍区在线观看| 波多野结衣av无码| 亚洲国产日韩欧美综合久久| 黄网在线免费| 亚洲色图欧美偷拍| 9久久9毛片又大又硬又粗| 精品国产老师黑色丝袜高跟鞋| 久久久www成人免费毛片麻豆| 欧美人一级淫片a免费播放| 国内精品视频666| 国产欧美日韩在线观看视频| 国产黄网站在线观看|