2013-04-11 12 views
94

JAVAで実用的なサービスを提供するシンプルな(ha)SOAPの例を探しています。Working Soapクライアントの例

私はこれを試してみましたexampleしかしそれはうまくいかず、スラッシュを入れてもらうように求めていますが、そこには何も起こっていません。

SOAPの例のリンクを知っている人はいますか?私はダウンロードできますか?

ありがとうございました。 Javaで簡単なSOAPクライアントを実装するために

答えて

185

、あなたはSAAJフレームワークを使用することができます(それは上記JSE 1.6に同梱されている):Java用の添付ファイルAPI(SAAJ)と

SOAPは、主に使用されますWebサービスAPIの背後で起こるSOAP要求/応答メッセージを直接処理します。これにより、開発者はJAX-WSを使用する代わりにSOAPメッセージを直接送受信できます。

SAAJを使用したSOAP Webサービスコールの動作例(実行!)を参照してください。それはthis web serviceを呼び出します。

import javax.xml.soap.*; 

public class SOAPClientSAAJ { 

    // SAAJ - SOAP Client Testing 
    public static void main(String args[]) { 
     /* 
      The example below requests from the Web Service at: 
      http://www.webservicex.net/uszip.asmx?op=GetInfoByCity 


      To call other WS, change the parameters below, which are: 
      - the SOAP Endpoint URL (that is, where the service is responding from) 
      - the SOAP Action 

      Also change the contents of the method createSoapEnvelope() in this class. It constructs 
      the inner part of the SOAP envelope that is actually sent. 
     */ 
     String soapEndpointUrl = "http://www.webservicex.net/uszip.asmx"; 
     String soapAction = "http://www.webserviceX.NET/GetInfoByCity"; 

     callSoapWebService(soapEndpointUrl, soapAction); 
    } 

    private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException { 
     SOAPPart soapPart = soapMessage.getSOAPPart(); 

     String myNamespace = "myNamespace"; 
     String myNamespaceURI = "http://www.webserviceX.NET"; 

     // SOAP Envelope 
     SOAPEnvelope envelope = soapPart.getEnvelope(); 
     envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI); 

      /* 
      Constructed SOAP Request Message: 
      <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myNamespace="http://www.webserviceX.NET"> 
       <SOAP-ENV:Header/> 
       <SOAP-ENV:Body> 
        <myNamespace:GetInfoByCity> 
         <myNamespace:USCity>New York</myNamespace:USCity> 
        </myNamespace:GetInfoByCity> 
       </SOAP-ENV:Body> 
      </SOAP-ENV:Envelope> 
      */ 

     // SOAP Body 
     SOAPBody soapBody = envelope.getBody(); 
     SOAPElement soapBodyElem = soapBody.addChildElement("GetInfoByCity", myNamespace); 
     SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("USCity", myNamespace); 
     soapBodyElem1.addTextNode("New York"); 
    } 

    private static void callSoapWebService(String soapEndpointUrl, String soapAction) { 
     try { 
      // Create SOAP Connection 
      SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); 
      SOAPConnection soapConnection = soapConnectionFactory.createConnection(); 

      // Send SOAP Message to SOAP Server 
      SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl); 

      // Print the SOAP Response 
      System.out.println("Response SOAP Message:"); 
      soapResponse.writeTo(System.out); 
      System.out.println(); 

      soapConnection.close(); 
     } catch (Exception e) { 
      System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n"); 
      e.printStackTrace(); 
     } 
    } 

    private static SOAPMessage createSOAPRequest(String soapAction) throws Exception { 
     MessageFactory messageFactory = MessageFactory.newInstance(); 
     SOAPMessage soapMessage = messageFactory.createMessage(); 

     createSoapEnvelope(soapMessage); 

     MimeHeaders headers = soapMessage.getMimeHeaders(); 
     headers.addHeader("SOAPAction", soapAction); 

     soapMessage.saveChanges(); 

     /* Print the request message, just for debugging purposes */ 
     System.out.println("Request SOAP Message:"); 
     soapMessage.writeTo(System.out); 
     System.out.println("\n"); 

     return soapMessage; 
    } 

} 
+0

このエラー '石鹸を得た:クライアントサーバはHTTPヘッダのSOAPActionの値を認識しなかった:' –

+0

のSOAPAction HTTPヘッダーが欠落しました。 'MimeHeaders headers = soapMessage.getMimeHeaders();という行を追加して訂正しました。 headers.addHeader( "SOAPAction"、 "http://ws.cdyne.com/VerifyEmail"); '。私は今、それなしでそれが前に働いたのは奇妙だと思う。 :) – acdcjunior

+0

おかげで多くの非常に有用 –

1

はい、任意のWSDLファイルを取得できる場合は、SoapUIを使用してユニットテストリクエストを含むサービスのモックサービスを作成できます。 I created an example of this (using Maven) that you can try out

はまた、WSDLの基本認証のためのhere is a giant list of free webservices someone posted.

+0

あなたのサンプルにリンクすると、404が返されます。 –

+2

リンクを修正しました。 – djangofan

-2

受け入れの回答コードでエラーが発生します。以下の代わりに

Authenticator.setDefault(new Authenticator() { 
    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication("username","password".toCharArray()); 
    } 
}); 
+0

これは "password" .toBase64() "なのか、そうでなければなりませんか?これはjavax.emailに使用するのと同じコードブロックです。 – djangofan

-3
String send = 
    "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + 
    "<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\">\n" + 
    "  <soap:Body>\n" + 
    "  </soap:Body>\n" + 
    "</soap:Envelope>"; 

private static String getResponse(String send) throws Exception { 
    String url = "https://api.comscore.com/KeyMeasures.asmx"; //endpoint 
    String result = ""; 
    String username="user_name"; 
    String password="pass_word"; 
    String[] command = {"curl", "-u", username+":"+password ,"-X", "POST", "-H", "Content-Type: text/xml", "-d", send, url}; 
    ProcessBuilder process = new ProcessBuilder(command); 
    Process p; 
    try { 
     p = process.start(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     StringBuilder builder = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
       builder.append(line); 
       builder.append(System.getProperty("line.separator")); 
     } 
     result = builder.toString(); 
    } 
    catch (IOException e) 
    { System.out.print("error"); 
     e.printStackTrace(); 
    } 

    return result; 
} 
0

それが最高だったacdcjuniorの応答を試してみて、私はちょうどあなたがXML要素を反復どのように見ることができます次のコード、との彼の説明を展開します。

public class SOAPClientSAAJ { 

public static void main(String args[]) throws Exception { 
    // Create SOAP Connection 
    SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); 
    SOAPConnection soapConnection = soapConnectionFactory.createConnection(); 

    // Send SOAP Message to SOAP Server 
    String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx"; 
    SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url); 



    SOAPPart soapPart=soapResponse.getSOAPPart(); 
    // SOAP Envelope 
    SOAPEnvelope envelope=soapPart.getEnvelope(); 
    SOAPBody soapBody = envelope.getBody(); 

    @SuppressWarnings("unchecked") 
    Iterator<Node> itr=soapBody.getChildElements(); 
    while (itr.hasNext()) { 

     Node node=(Node)itr.next(); 
     if (node.getNodeType()==Node.ELEMENT_NODE) { 
      System.out.println("reading Node.ELEMENT_NODE"); 
      Element ele=(Element)node; 
      System.out.println("Body childs : "+ele.getLocalName()); 

      switch (ele.getNodeName()) { 

      case "VerifyEmailResponse": 
      NodeList statusNodeList = ele.getChildNodes(); 

      for(int i=0;i<statusNodeList.getLength();i++){ 
       Element emailResult = (Element) statusNodeList.item(i); 
       System.out.println("VerifyEmailResponse childs : "+emailResult.getLocalName()); 
       switch (emailResult.getNodeName()) { 

       case "VerifyEmailResult": 
        NodeList emailResultList = emailResult.getChildNodes(); 

        for(int j=0;j<emailResultList.getLength();j++){ 
         Element emailResponse = (Element) emailResultList.item(j); 
         System.out.println("VerifyEmailResult childs : "+emailResponse.getLocalName()); 
         switch (emailResponse.getNodeName()) { 
         case "ResponseText": 
          System.out.println(emailResponse.getTextContent()); 
          break; 
         case "ResponseCode": 
          System.out.println(emailResponse.getTextContent()); 
          break; 
         case "LastMailServer": 
          System.out.println(emailResponse.getTextContent()); 
          break; 
         case "GoodEmail": 
          System.out.println(emailResponse.getTextContent()); 
         default: 
          break; 
         } 
        } 
        break; 
       default: 
        break; 
       } 
      } 


      break; 


      default: 
      break; 
      } 

     } else if (node.getNodeType()==Node.TEXT_NODE) { 
      System.out.println("reading Node.TEXT_NODE"); 
      //do nothing here most likely, as the response nearly never has mixed content type 
      //this is just for your reference 
     } 
    } 
    // print SOAP Response 
    System.out.println("Response SOAP Message:"); 
    soapResponse.writeTo(System.out); 

    soapConnection.close(); 
} 

private static SOAPMessage createSOAPRequest() throws Exception { 
    MessageFactory messageFactory = MessageFactory.newInstance(); 
    SOAPMessage soapMessage = messageFactory.createMessage(); 
    SOAPPart soapPart = soapMessage.getSOAPPart(); 

    String serverURI = "http://ws.cdyne.com/"; 

    // SOAP Envelope 
    SOAPEnvelope envelope = soapPart.getEnvelope(); 
    envelope.addNamespaceDeclaration("example", serverURI); 

    /* 
    Constructed SOAP Request Message: 
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="http://ws.cdyne.com/"> 
     <SOAP-ENV:Header/> 
     <SOAP-ENV:Body> 
      <example:VerifyEmail> 
       <example:email>[email protected]</example:email> 
       <example:LicenseKey>123</example:LicenseKey> 
      </example:VerifyEmail> 
     </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
    */ 

    // SOAP Body 
    SOAPBody soapBody = envelope.getBody(); 
    SOAPElement soapBodyElem = soapBody.addChildElement("VerifyEmail", "example"); 
    SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("email", "example"); 
    soapBodyElem1.addTextNode("[email protected]"); 
    SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("LicenseKey", "example"); 
    soapBodyElem2.addTextNode("123"); 

    MimeHeaders headers = soapMessage.getMimeHeaders(); 
    headers.addHeader("SOAPAction", serverURI + "VerifyEmail"); 

    soapMessage.saveChanges(); 

    /* Print the request message */ 
    System.out.println("Request SOAP Message:"); 
    soapMessage.writeTo(System.out); 
    System.out.println(""); 
    System.out.println("------"); 

    return soapMessage; 
} 

}

関連する問題