2

私はSOAPに非常に慣れていないので、オンラインでいくつかのプログラムを調べていました.これは私が思いついたものですが、null応答が返されました.

以下の私のコードと出力を見てください。ありがとう

コード

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;

public class AtomicNumber {
  public static void main(String[] args) {
    try {
      SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance();
      SOAPConnection connection = sfc.createConnection();

      MessageFactory mf = MessageFactory.newInstance();
      SOAPMessage smsg = mf.createMessage();

      SOAPHeader shead = smsg.getSOAPHeader();

      SOAPBody sbody = smsg.getSOAPBody();
      shead.detachNode();
      QName bodyName = new QName("http://www.webserviceX.NET", "GetAtomicNumber", "web");
      SOAPBodyElement bodyElement = sbody.addBodyElement(bodyName);
      QName qn = new QName("ElementName");
      SOAPElement quotation = bodyElement.addChildElement(qn);

      quotation.addTextNode("iron");

      System.out.println("\n Soap Request:\n");
      smsg.writeTo(System.out);
      System.out.println();

      URL endpoint = new URL("http://www.webservicex.net/periodictable.asmx");
      SOAPMessage response = connection.call(smsg, endpoint);

    System.out.println("\n Soap Response:\n");

     System.out.println(response.getContentDescription());


    } catch (Exception ex) {
      ex.printStackTrace();
    }
}
}

私の出力

 Soap Request:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><web:GetAtomicNumber xmlns:web="http://www.webserviceX.NET"><ElementName>sodium</ElementName></web:GetAtomicNumber></SOAP-ENV:Body></SOAP-ENV:Envelope>

 Soap Response:

null

アップデート

これは私が得ているものです(例外)

<faultcode>soap:Server</faultcode>
     <faultstring>System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.SqlClient.SqlException: Procedure or function 'GetAtomicNumber' expects parameter '@ElementName', which was not supplied.
at WebServicex.periodictable.GetAtomicNumber(String ElementName)
 --- End of inner exception stack trace ---</faultstring>
4

5 に答える 5

4

やりたいことは、この Web サービスの Java コードを自動生成することです。WSDL はこちら: http://www.webservicex.net/periodictable.asmx?wsdl

Java では、コードを自動生成するツールはwsimport. 次のようなものを使用する必要があります。

wsimport http://www.webservicex.net/periodictable.asmx?wsdl -p com.company.whateveruwant -Xnocompile -d . -keep

これにより、必要なコードが指定されたパッケージ (ここではcom.company.whateveruwant) に配置されます。

そこから、通常の Java ライブラリのように SOAP メソッドを呼び出すだけです。

PeriodictableSoap soap = new Periodictable().getPeriodictableSoap();
System.out.println(soap.getAtomicNumber("Iron"));

これは出力します:

<NewDataSet>
  <Table>
    <AtomicNumber>26</AtomicNumber>
    <ElementName>Iron</ElementName>
    <Symbol>Fe</Symbol>
    <AtomicWeight>55.847</AtomicWeight>
    <BoilingPoint>3300</BoilingPoint>
    <IonisationPotential>7.9</IonisationPotential>
    <EletroNegativity>1.6400000000000001</EletroNegativity>
    <AtomicRadius>1.17</AtomicRadius>
    <MeltingPoint>1808</MeltingPoint>
    <Density>7874</Density>
  </Table>
</NewDataSet>
于 2012-09-27T12:49:36.053 に答える
1

試してみてください

   QName qn = new QName("http://www.webserviceX.NET","ElementName","web");

編集:また、他の人が示唆しているように-ここで生成されたクライアントコードを使用する方がよいでしょう-Axis、JAX-WSなどはすべてオプションです。

正しいコードは次のようになります。

  QName bodyName = new QName("http://www.webserviceX.NET", "GetAtomicNumber");
  SOAPBodyElement bodyElement = sbody.addBodyElement(bodyName);
  QName qn = new QName("ElementName");
于 2012-09-27T12:35:05.387 に答える
0

素の SOAP クラスを使用する必要が本当にありますか? このボイラープレートをすべて取り除くためにJAX-WS アーティファクトを生成するのはどうですか?

詳細(ANTを組み込む)はこちら.

于 2012-09-27T12:08:31.207 に答える
0

@リッキー、これは正しいコードです。

SOAPBody body = message.getSOAPBody();
QName bodyName = new QName("http://www.webserviceX.NET", "GetAtomicNumber");
SOAPBodyElement bodyElement = body.addBodyElement(bodyName);
SOAPElement symbol = bodyElement.addChildElement("MyMetal");
symbol.addTextNode("iron");
SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
SOAPMessage response = connection.call(message, endpoint);
connection.close();
message.writeTo(System.out);
System.out.println();
response.writeTo(System.out);
System.out.println();
于 2013-02-25T05:48:19.657 に答える
0

cxf-codegen-plugin maven プラグインを使用すると、次の依存関係を追加することで SOAP サービスのクライアントをすばやく作成できます。

<dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-core</artifactId>
            <version>2.4.2</version>
        </dependency>

そして、このビルド セクションを追加します。

org.apache.cxf cxf-codegen-plugin 2.1.2 generate-sources generate-sources wsdl2java ${basedir}/target/generated-sources/cxf ${basedir}/src/main/resources/wsdlfile.wsdl -client -wsdlLocation -p com.package.for.generated.クラス

${basedir}/target/generated-sources/cxf 内には、Web サービスを呼び出すために必要なクラスとその方法の例があります。

それが役に立てば幸い!

于 2012-09-27T13:09:38.090 に答える