2012-01-25 12 views
2

私はMacでRESTClient(wiztools)を使って手動で使うことができる簡単なRESTリクエストを持っています。 URLはhttp://ws-argos.clsamerica.com/argosDws/services/DixService?getXmlで、体は以下の通りです:linuxコマンドラインからの単純なカールの失敗

<soap:Envelope 
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:typ="http://service.dataxmldistribution.argos.cls.fr/types"> 
    <soap:Body> 
    <typ:xmlRequest> 
    <typ:username>******</typ:username> 
    <typ:password>******</typ:password> 
    <typ:platformId>62518,62688,62520,62602,62608</typ:platformId> 
    <typ:nbDaysFromNow>10</typ:nbDaysFromNow> 
    </typ:xmlRequest> 
</soap:Body> 
</soap:Envelope> 

これは、実際のデータをたっぷりとXMLのきちんとしたビットを返します。だから私はデータがあることを知っていることを知っている。しかし、私は、Linuxで毎晩スクリプトでこれを自動化したい、と下の2つのスクリプトを使用して、このためにCURLを使用しようとしています:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:typ="http://service.dataxmldistribution.argos.cls.fr/types"> 
<soap:Body> 
    <typ:xmlRequest> 
    <typ:username>******</typ:username> 
    <typ:password>******</typ:password> 
    <typ:platformId>62518,62688,62520,62602,62608</typ:platformId> 
    <typ:nbDaysFromNow>10</typ:nbDaysFromNow> 
    </typ:xmlRequest> 
</soap:Body> 

:とのsoap.xmlを呼び出し

curl -H "content-type: application/soap+xml" \ 
-H "SOAPAction:" \ 
[email protected] \ 
-X POST http://ws-argos.clsamerica.com/argosDws/services/DixService?getXml \ 
> output.xml 

出力は次のとおりです。

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
<soap:Body><soap:Fault>  
<soap:Code><soap:Value>soap:Sender</soap:Value></soap:Code> 
<soap:Reason><soap:Text xml:lang="en">Error reading XMLStreamReader.</soap:Text> 
</soap:Reason> 
</soap:Fault></soap:Body></soap:Envelope> 

誰もがこれを解決する方法を知っている、またはに良い方法ありませんそれを自動化する?私はCURLを初めて使っていますが、もし誰かがそれを可能性として示唆すれば、Javaで何かを作ることができます(例:-))

答えて

0

私はCurlを使っていませんが、下記参照。

@Test 
public void test_parse() throws IOException, DixException_Exception { 
    try { 
    DixServicePortType argos = new DixService().getDixServicePort(); 
    CsvRequestType params = new CsvRequestType(); 
    params.setShowHeader(true); 
    params.setUsername("your_user_name"); 
    params.setPassword("your_password"); 
    params.setDisplaySensor(true); 
    // params.setProgramNumber("your_program_number"); 
    params.setPlatformId("your_device_id"); 
    params.setNbDaysFromNow(2); 
    StringResponseType csvres = argos.getCsv(params); 
    assertNotNull(csvres); 
    System.out.println(csvres.getReturn()); 

    StringResponseType xmlres = argos.getXml(params); 
    assertNotNull(xmlres); 
    System.out.println(xmlres.getReturn()); 

    } catch (SOAPFaultException e) { 
     e.printStackTrace(); 
     fail(e.getMessage()); 
    } 
} 

wsdluri='https://ws-argos.cls.fr/argosDws/services/DixService?wsdl' 
gensrcdir='./src' 
targetpackage='com.mypackage' 
genoutdir='./war/WEB-INF/classes' 
wsimport -extension -d "$genoutdir" -s "$gensrcdir" -p $targetpackage -keep "$wsdluri" 

ここで生成されたコードのための簡単なテストがあります:How to Build a SOAP Client on Google App Engineここ

あなたはアルゴスWebサービス用のコードを生成するために使用できるスクリプトです:私はこの例を踏襲してきました私はWebサービスをhttpsアドレスに向けているが、生成されたコードはまだhttp経由で接続されているようだ。 httpsを試してみたいですが、手動で変更する必要があります。

今、私はJaxbを使用してXML応答を解析したいと考えています。私はCSVの出力に対処することができますが、それは簡単ですが、それは石鹸ですから、同じようにすべてを行うこともあります。 ご提案は大歓迎です。

[編集] 私は、XMLデータのスキーマを取得し、jaxb経由でアンマーシャリングするための「xjc」コンパイラを使用してクラスを生成することに成功しました。 スキーマを取得するのと同じくらい簡単です。そして、あなたがクラスを生成する「XJC」を呼び出すことができる

StringResponseType xmlSchema = argos.getXsd(new XsdRequestType()); 
    assertNotNull(xmlSchema); 
    System.out.println(xmlSchema.getReturn()); 
    // save schema to argos.xsd file 

xjc -p com.mypackage argos.xsd 

は、残念ながら、私が前に持っていた問題があります、不足している「XmlRootElementが含まの場合を"注釈。その点についてはSO questionsがたくさんあります。 私が理解する限り、特定の名前をユニークなものとして扱うことを強制するのは「jxc」です(this articleも参照してください)。スキーマを変更するのではなく、外部バインディング設定ファイルを使って "jxc"を設定しようとしました。それはうまくいかなかったが、それは他の人々のために働いていた。今、私はJAXBを使用してXMLデータを解析することができます

<xs:annotation> 
    <xs:appinfo> 
     <jaxb:globalBindings> 
      <xjc:simple /> 
     </jaxb:globalBindings> 
    </xs:appinfo> 
</xs:annotation> 

<xs:element name="data" type="data"/> 

: だから最後に、私は、生成されたクラスにXmlRootElementが含ま注釈を追加したスキーマにいくつかの小さな手動で変更を行いました。Restletのjaxbコネクタの例を次に示します。

ConverterHelper decoder = new JaxbConverter(); 
Data data = decoder.toObject(new StringRepresentation(xmlres.getReturn()), Data.class, null); 

この解決策に問題がある場合は、ご意見ください。

関連する問題