jdom2でXMLを作成してSOAPリクエストを送信する
SOAPリクエスト送信では、下記のようなApache Axis等のフレームワークでwsdlからスタブ作成する手順が一般的です。
重厚なフレームワークを使わずに、もっとシンプルに実装してみることを目的にHttpClientでSOAPリクエストを送信するところを実装してみました。
まずはWSDLの解説から。。題材は以前と同じで、
http://public.dejizo.jp/SoapServiceV11.asmx?WSDL
です。
上のwsdlで見るところは、<soap:operation>のsoapAction属性、<wsdl:operation>のname属性と、上のほうにある<s:sequence>で囲まれたところです。
<wsdl:operation name="GetDicList"> <soap:operation soapAction="http://MyDictionary.jp/SOAPServiceV11/GetDicList" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation>
SOAPActionは"http://MyDictionary.jp/SOAPServiceV11/GetDicList"になり、 wsdl:operationのname属性はメソッド名でGetDicListになります。
SOAPAction属性はリクエストHTTPのヘッダに付加します。
<s:element name="GetDicList"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="AuthTicket" type="s:string"/> </s:sequence> </s:complexType> </s:element>
<s:sequence>で囲まれたところはメソッドのパラメータになります。
では実際にXMLを作成します。使用するのはjdom2です。
Document document = new Document(); Namespace soapenv = Namespace.getNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/"); Element rootElement = new Element("Envelope", soapenv); Element bodyElement = new Element("Body", soapenv); Element getDicListElement = new Element("GetDicList"); Element authTicketElement = new Element("AuthTicket"); getDicListElement.addContent(authTicketElement.setText("")); bodyElement.addContent(getDicListElement); rootElement.addContent(bodyElement); document.addContent(rootElement);
下のXMLが作成されます。
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetDicList> <AuthTicket></AuthTicket> </GetDicList> </soap:Body> </soap:Envelope>
このXMLのSOAPメッセージを以前の記事を参考にHttpClientでSOAPリクエストしてみました。
package com.example.test; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.Namespace; import org.jdom2.output.XMLOutputter; public class SoapHttpClient { public static void main(String[] args){ HttpClient httpClient = new DefaultHttpClient(); Document document = new Document(); Namespace soapenv = Namespace.getNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/"); Element rootElement = new Element("Envelope", soapenv); Element bodyElement = new Element("Body", soapenv); Element getDicListElement = new Element("GetDicList"); Element authTicketElement = new Element("AuthTicket"); getDicListElement.addContent(authTicketElement.setText("")); bodyElement.addContent(getDicListElement); rootElement.addContent(bodyElement); document.addContent(rootElement); System.out.print(new XMLOutputter().outputString(document)); String body = new XMLOutputter().outputString(document); HttpPost httppost = new HttpPost("http://public.dejizo.jp/SoapServiceV11.asmx"); StringEntity stringentity=new StringEntity(body,"UTF-8"); httppost.setEntity(stringentity); httppost.addHeader("Content-Type" , "text/xml"); httppost.addHeader("SOAPAction","http://MyDictionary.jp/SOAPServiceV11/GetDicList"); HttpResponse response = null; try { response = httpClient.execute(httppost); HttpEntity entity = response.getEntity(); String strresponse = null; if(entity!=null) { strresponse = EntityUtils.toString(entity, "UTF-8"); } System.out.println(strresponse.toString()); } catch (Exception e){ System.out.println(e.toString()); } } }
これで、SOAPResponseが返ってきました。
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetDicListResponse xmlns="http://MyDictionary.jp/SOAPServiceV11"><GetDicListResult><DicInfo><DicID>8a68bb8a-16ee-4b51-afaa-74c277bb600a</DicID><FullName>Edict和英辞典</FullName><ShortName>Edict和英辞典</ShortName><Publisher /><Abbrev>EdictJE</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>19553dab-aa51-43bb-9fb7-764153b647ac</DicID><FullName>EJDict英和辞典</FullName><ShortName>EJDict英和辞典</ShortName><Publisher /><Abbrev>EJdict</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>fc6bde1b-220d-4171-abe8-7c040db4629e</DicID><FullName>JMdict独和辞典</FullName><ShortName>JMdict独和辞典</ShortName><Publisher /><Abbrev>JMdictDJ</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>3cb5934a-b1df-48db-8f1a-592e6c8d3d20</DicID><FullName>JMdict仏和辞典</FullName><ShortName>JMdict仏和辞典</ShortName><Publisher /><Abbrev>JMdictFJ</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>ba156c74-638c-4b4c-a545-34632f8cf205</DicID><FullName>JMdict露和辞典</FullName><ShortName>JMdict露和辞典</ShortName><Publisher /><Abbrev>JMdictRJ</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>c188c173-cf9e-4840-a4d2-7b00e9906291</DicID><FullName>JMdict和独辞典</FullName><ShortName>JMdict和独辞典</ShortName><Publisher /><Abbrev>JMdictJD</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>4c2315e2-adf4-4648-b88a-7c102126a0ae</DicID><FullName>JMdict和仏辞典</FullName><ShortName>JMdict和仏辞典</ShortName><Publisher /><Abbrev>JMdictJF</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>c86c5ca7-5c6e-46c5-8c1d-25c4e11a7800</DicID><FullName>JMdict和露辞典</FullName><ShortName>JMdict和露辞典</ShortName><Publisher /><Abbrev>JMdictJR</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>39124c12-6244-4c65-94eb-8b18c20c2898</DicID><FullName>フリー百科辞典 ウィキペディア日本語版</FullName><ShortName>ウィキペディア日本語版</ShortName><Publisher>ウィキメディア財団</Publisher><Abbrev>wpedia</Abbrev><StartItemID>NOTICE</StartItemID><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>992c7c7d-0f1d-4127-a567-fd936a65c64c</DicID><FullName>三省堂 デイリーコンサイス英和辞典(試用版)</FullName><ShortName>デイリーコンサイス英和(試用版)</ShortName><Publisher>三省堂</Publisher><Abbrev>DailyEJL</Abbrev><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>IDIOM</ID><Name>成句</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>一部が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption><SearchOption><Name>完全一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>EXACT</MatchOption></SearchOption><SearchOption><Name>成句検索</Name><ScopeID>IDIOM</ScopeID><MatchOption>EXACT</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>8893ca10-e596-4df3-9393-69b799610f7d</DicID><FullName>三省堂 デイリーコンサイス国語辞典(試用版)</FullName><ShortName>デイリーコンサイス国語(試用版)</ShortName><Publisher>三省堂</Publisher><Abbrev>DailyJJL</Abbrev><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>一部が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption><SearchOption><Name>完全一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>EXACT</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo><DicInfo><DicID>439ddafa-87c7-4090-b486-88cac45747a5</DicID><FullName>三省堂 デイリーコンサイス和英辞典(試用版)</FullName><ShortName>デイリーコンサイス和英(試用版)</ShortName><Publisher>三省堂</Publisher><Abbrev>DailyJEL</Abbrev><ScopeList><Scope><ID>HEADWORD</ID><Name>見出し語</Name></Scope><Scope><ID>ANYWHERE</ID><Name>全文</Name></Scope></ScopeList><SearchOptionList><SearchOption><Name>語頭が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>STARTWITH</MatchOption></SearchOption><SearchOption><Name>語尾が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>ENDWITH</MatchOption></SearchOption><SearchOption><Name>一部が一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption><SearchOption><Name>完全一致</Name><ScopeID>HEADWORD</ScopeID><MatchOption>EXACT</MatchOption></SearchOption><SearchOption><Name>本文も検索</Name><ScopeID>ANYWHERE</ScopeID><MatchOption>CONTAIN</MatchOption></SearchOption></SearchOptionList><DefSearchOptionIndex>0</DefSearchOptionIndex><ItemMapList /></DicInfo></GetDicListResult></GetDicListResponse></soap:Body></soap:Envelope>
この次は、WSDLを詳細に調べてみようかな。
- 作者: 竹添直樹,島本多可子,小津美夕紀,亀井隆司
- 出版社/メーカー: 翔泳社
- 発売日: 2013/10/30
- メディア: Kindle版
- この商品を含むブログを見る