gpt4 book ai didi

java - 为什么这个简单的 SOAP 客户端不工作 (org.apache.http)?

转载 作者:搜寻专家 更新时间:2023-11-01 01:45:15 24 4
gpt4 key购买 nike

我想将 XML 文件作为请求发送到 SOAP 服务器。这是我的代码:(修改自 Sending HTTP Post request with SOAP action using org.apache.http )

import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.protocol.HTTP;
import org.apache.http.HttpResponse;
import java.net.URI;

public static void req() {
try {
HttpClient httpclient = new DefaultHttpClient();
String body="xml here";
String bodyLength=new Integer(body.length()).toString();

URI uri=new URI("http://1.1.1.1:100/Service");
HttpPost httpPost = new HttpPost(uri);
httpPost.setHeader( "SOAPAction", "MonitoringService" );
httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");


StringEntity entity = new StringEntity(body, "text/xml",HTTP.DEFAULT_CONTENT_CHARSET);
httpPost.setEntity(entity);

RequestWrapper requestWrapper=new RequestWrapper(httpPost);
requestWrapper.setMethod("POST");


requestWrapper.setHeader("Content-Length",bodyLength);
HttpResponse response = httpclient.execute(requestWrapper);
System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
}
}

在此之前,我从服务器收到错误“http 500”(内部服务器错误),但现在我根本没有收到任何回复。我知道服务器工作正常,因为其他客户端没有问题。

谢谢。

最佳答案

org.apache.http API 不是 SOAP/web 服务感知的,因此您正在以非标准的方式完成棘手的工作。该代码对 Java 不是很友好或不灵活,因为它不能自动将 Java 对象数据“绑定(bind)”(转换)到 SOAP 请求和 SOAP 响应之外。它有点冗长、难以调试和开始工作,而且很脆弱 - 您是否正在处理完整的 SOAP 协议(protocol),包括故障处理等?

我可以建议使用内置于 JVM 中的 JAX-WS 标准吗:

<强>1。将 WSDL 文件保存到本地磁盘
例如。 <app path>/META-INF/wsdl/abc.com/calculator/Calculator.wsdl
如果您没有 WSDL,您可以在浏览器中输入并将结果页面保存到磁盘:
http://abc.com/calculator/Calculator?wsdl

<强>2。使用 wsimport 命令将 WSDL 转换为 java 类文件
对于 JDK,工具在 <jdkdir>\bin\wsimport.exe (or .sh) 中.
对于应用程序服务器,将类似于 <app_server_root>\bin\wsimport.exe (or .sh)

<filepath>\wsimport -keep -verbose <wsdlpath>\Calculator.wsdl

或者如果您的 WSDL 可通过预先存在的网络服务获得

<filepath>\wsimport -keep -verbose http://abc.com/calculator/Calculator?wsdl

(也可以包含“-p com.abc.calculator”来设置生成类的包)

生成如下文件 - 在您的 java 项目中包含这些源文件:

com\abc\calculator\ObjectFactory.java       
com\abc\calculator\package-info.java
com\abc\calculator\Calculator.java ............................name = `<wsdl:portType>` name attribute
com\abc\calculator\CalculatorService.java ................name = `<wsdl:service>` name attribute
com\abc\calculator\CalculatorRequestType.java .......name = schema type used in input message
com\abc\calculator\CalculatorResultType.java ..........name = schema type used in output message

<强>2。创建 JAX-WS SOAP 网络服务客户端

package com.abc.calculator.client;

import javax.xml.ws.WebServiceRef;
import com.abc.calculator.CalculatorService;
import com.abc.calculator.Calculator;

public class CalculatorClient {

@WebServiceRef(wsdlLocation="META-INF/wsdl/abc.com/calculator/Calculator.wsdl")
// or @WebServiceRef(wsdlLocation="http://abc.com/calculator/Calculator?wsdl")
public static CalculatorService calculatorService;

public CalculatorResponseType testCalculation() {
try {
CalculatorRequestType request = new CalculatorRequest();
request.setSomeParameter("abc");
request.setOtherParameter(3);
Calculator calculator = calculatorService.getCalculatorPort();
// automatically generate SOAP XML message, send via HTTP,
// receive & marshal response to java object
String response = calculator.doCalculation(response);
} catch(Exception e) {
e.printStackTrace();
}
}
}

关于java - 为什么这个简单的 SOAP 客户端不工作 (org.apache.http)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12827900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com