Java Axis2调用C# webService 传递参数问题,就没有一个人能解决问题这问题?这到底有多难。
已经发了三个帖子了,也问了十多个人了。我想这问题应该没人知道了诶 技术牛人都回家过年了?
问题是这样的:
接口是C#写的,我这边Java调用他的方法
调用说明:
接口所有参数均使用xml字符串;
String 类型 XML格式 参数
我这边参数 在工具里面测试 是可以测试出数据一切正常,在myeclipse代码执行 总返回XML格式错误
无参方法可以成功获取数据,有参方法都是格式不正确 找了一个多星期了都没有收获 = =我只想说我没做过Webservice这一块。
求大神帮忙解决下面帖子是之前发的方法需求等:
http://bbs.csdn.net/topics/390695224?page=1#post-396612018
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class AV {
/**
* @param args
* 航班接口测试
*/
public static void main(String[] args) {
//AV参数
String xml = "<?xml version="1.0" encoding="UTF-8"?>" +
"<ParamsXml><Params>" +
"<AgentID>HBJT</AgentID>" +
"<DepartureAirport>CAN</DepartureAirport>" +
"<ArriveAirport>PEK</ArriveAirport>" +
"<DepartureDate>2014-02-20</DepartureDate>" +
"<CarrierCode>CZ</CarrierCode>" +
"<FS>D</FS>" +
"</Params></ParamsXml>";
System.out.println("输出参数"+xml);
//WebService 调用工具
String url = "http://ws04.itour.cn:8084/ItourAgentCRSService.asmx";
//操作命名控件 和 方法
QName qname = new QName("http://itour.cn/","AV");
//设定参数类型
Object param[] = new Object[] { xml };
try {
//实例化远程服务调用客户端对象
RPCServiceClient client = new RPCServiceClient();
//实例化Options对象
Options options = new Options();
//设置Options对象的连接终端地址
options.setTo(new EndpointReference(url));
//设置Options对象的操作事件对象
options.setAction("http://itour.cn/AV");
//为远程服务调用客户端对象设置Options子对象
client.setOptions(options);
//传递参数,调用服务,获取服务返回结果集
OMElement element = client.invokeBlocking(qname, param);
//获取返回结果集中第一条结果的返回内容
String result=element.getFirstElement().getText();
System.out.println("返回结果"+result);
} catch (AxisFault e) {
e.printStackTrace();
}
}
}
输出参数<?xml version="1.0" encoding="UTF-8"?><ParamsXml><Params><AgentID>HBJT</AgentID><DepartureAirport>CAN</DepartureAirport><ArriveAirport>PEK</ArriveAirport><DepartureDate>2014-02-20</DepartureDate><CarrierCode>CZ</CarrierCode><FS>D</FS></Params></ParamsXml>
返回结果<?xml version="1.0" encoding="UTF-8"?><ItourAgentCRSService><Success>01</Success><Errors>Xml输入参数格式不正确</Errors><Result></Result></ItourAgentCRSService>
call.addParameter("CarrierCode", XMLType.XSD_INTEGER, ParameterMode.IN);
call.addParameter("FS", XMLType.XSD_INTEGER, ParameterMode.IN);
String result = (String)call.invoke(
new Object[] {"GDDX","CAN","PEK","2014-01-18","","D"});
System.out.println(result);
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
[解决办法]
楼主别纠结了,我给你点东西:
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace namespace = factory.createOMNamespace("http://xxx你的namespace", "xsd");
OMElement jsonElement = factory.createOMElement("jsonstr",null);//jsonstr,参数名
String fcJson = fcObj.toString();//json字符串
jsonElement.addChild(factory.createOMText(jsonElement,fcJson));//参数赋值
OMElement method = factory.createOMElement("方法名称",namespace);//换成你自己的
method.addChild(jsonElement);//给方法加入参数
//最后调用并传递参数
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMElement result = sender.sendReceive(method);
String resultStr = result.getFirstElement().getText();
[解决办法]
会的人绝对是不少,不过主要还得靠自己努力
[解决办法]
仔细看看,http抓包看得很明显的,如果不好用,装个wireshark,没数据说明在本地就已经没通过,而你的说明是服务器返回了,看仔细点