【问题标题】:Java send XML StringJava 发送 XML 字符串
【发布时间】:2017-01-27 20:31:08
【问题描述】:

您好,我需要发送一个带有字符串 XML 的请求,我正在尝试这种方式:

final String SOAP_ACTION     = "http://tempuri.org/Search";
final String METHOD_NAME     = "Search";
final String NAME_SPACE      = "http://tempuri.org/";
final String URL             = "https://www.url.com/xxx/xxx.asmx?wsdl";
String       XML             = "<data><id>"+ paramId +"</id><phone>"+ paramPhone +"</phone></data>";
SoapObject request           = new SoapObject(NAME_SPACE, METHOD_NAME);
request.addProperty("", XML); //I don't know how to pass it here
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet                             = true;
envelope.setOutputSoapObject(request);
HttpTransportSE             httpTransport   = new HttpTransportSE(URL);
try {
        httpTransport.call(SOAP_ACTION, envelope);
        Object res = envelope.getResponse();
        if (res instanceof SoapPrimitive ) {
            return (((SoapPrimitive) res).toString());
        }
        return String.valueOf(res);
    } catch (IOException | XmlPullParserException ex) { }

但我收到此错误:

SoapFault - 故障代码:
'soap:Server' faultstring: '服务器无法处理请求。
---> 对象引用未设置为对象的实例。'
faultactor:'null' 详细信息:org.kxml2.kdom.Node@16050315

提前致谢。

【问题讨论】:

  • 仅供参考:您不会将 SOAP 消息发送到 ?wsdl URL。 ?wsdl URL 用于检索 Web 服务端点的 WSDL。
  • 您从服务器收到一条错误消息,指出服务器遇到了 NullPointerException(或等效项)。您应该检查服务器代码和/或日志文件以获取更多详细信息。
  • 仅供参考: 使用字符串连接构建 XML 是一个非常糟糕的主意,除非您自己处理 XML 转义。如果有人在他们的电话号码中输入了&lt;,您最终会得到错误的 XML。当然,电话号码验证逻辑可能会防止这种情况发生,但您不能总是依赖它。
  • 好的,我减去了 ?wsdl,但是如何在 中传递数据 ????

标签: java xml soap


【解决方案1】:

在 Java 中,您可以使用 wsimport 为您创建 SOAP 存根。这使它变得容易得多。存根已经为您完成了一些转换任务。

如果 String 参数包含 XML 元素,则它们是 URL 编码的,至少 作为 > 在您的情况下,如果您仅通过简单的字符串替换对字符串参数执行此操作,它应该会有所帮助:

XML = XML.replace("<", "&lt;");
XML = XML.replace(">", "&gt;");
request.addProperty("", XML); //now encoded, but server will understand!

【讨论】:

    【解决方案2】:

    尝试使用 wsimport 或 Axis2 之类的第 3 方库来创建 jar 客户端,该客户端将轻松将您的 bean 转换为格式良好的 XML 请求。

    使用 wsimport 构造客户端:

    开始之前,你可以在$JDK/bin文件夹中找到wsimport工具。

     wsimport -keep -verbose https://www.url.com/xxx/xxx.asmx?wsdl
    


    使用 Axis2 构建客户端。
    来自site的示例:

    短篇小说:

    1. 如果您尚未下载并解压 Apache Axis2 Standard Distribution,请下载并解压。
    2. 使用以下命令创建客户端存根(假设当前工作目录中有 Axis2UserGuide.wsdl 文件):

    %AXIS2_HOME%\bin\WSDL2Java -uri Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d adb -s

    1. 创建客户端(例如,Client.java),一个使用生成的存根的 Java 应用程序,并将其保存在 org/apache/axis2/axis2userguide 目录中。

    2. 通过键入以下内容构建客户端:ant jar.client。

    3. 假设您有相应的服务,通过将生成的位于 build/lib 中的 Axis2UserGuideService-test-client.jar 文件添加到类路径并键入:java org.apache.axis2.axis2userguide.Client

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 2014-07-08
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 2014-07-14
      相关资源
      最近更新 更多