我们在调用外部webservice接口时,发现接口返回的错误信息提示为:
服务器未能识别 HTTP 头 SOAPAction 的值
我们之前与其他厂商(采用PHP、C#、JAVA开发)都进行过联调,不存在类似问题。
附代码:
String endpoint = “调用地址”;
org.apache.axis.client.Service service = new org.apache.axis.client.Service();
Call call = null;
try {
call = (Call) service.createCall();
} catch (ServiceException e) {
e.printStackTrace();
}
call.setTargetEndpointAddress(endpoint);
call.setOperationName(new QName(endpoint, “方法名”));
call.addParameter(“属性1”, XMLType.XSD_LONG, ParameterMode.IN);
…
调用接口的代码采用axis开发,经过研究发现,外部接口开发商使用.NET进行开发,在接口中设置了soapaction。具体的信息可以通过webservice的wsdl查看,在wsdl直接搜索action就能看到,不同方法可能对应不同的soapaction,在调用时需要注意。
修改之后的代码:
String endpoint = “调用地址”;
org.apache.axis.client.Service service = new org.apache.axis.client.Service();
Call call = null;
try {
call = (Call) service.createCall();
} catch (ServiceException e) {
e.printStackTrace();
}
call.setTargetEndpointAddress(endpoint);
call.setUseSOAPAction(true);
call.setSOAPActionURI(“查询到的soapaction”);
call.setOperationName(new QName(endpoint, “方法名”));
call.addParameter(“属性1”, XMLType.XSD_LONG, ParameterMode.IN);
…
-----------------时间线---------------------------
webservice接口报错信息: 服务器无法处理请求。 —> 未将对象引用设置到对象的实例
axis调用代码:
String endpoint = “webservice地址”;
Service service = new Service();
Call call = null;
try {
call = (Call) service.createCall();
} catch (ServiceException e) {
e.printStackTrace();
}
call.setUseSOAPAction(true);
call.setSOAPActionURI(“webservice接口的soapaction”);
call.setTargetEndpointAddress(endpoint);
call.setOperationName(new QName(“webservice的namepace”, “方法名”));
call.addParameter(“属性名”, XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnClass(String.class);
String result = null;
try {
result = (String) call.invoke(new Object[] {“1”});
} catch (RemoteException e) {
e.printStackTrace();
}
修改之后就不会报错,修改的内容如下:
String endpoint = “webservice地址”;
Service service = new Service();
Call call = null;
try {
call = (Call) service.createCall();
} catch (ServiceException e) {
e.printStackTrace();
}
call.setUseSOAPAction(true);
call.setSOAPActionURI(“webservice接口的soapaction”);
call.setTargetEndpointAddress(endpoint);
call.setOperationName(new QName(“webservice的namepace”, “方法名”));
call.addParameter(new QName(“http://tempuri.org/”, “属性名”), XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnClass(String.class);
String result = null;
try {
result = (String) call.invoke(new Object[] {“1”});
} catch (RemoteException e) {
e.printStackTrace();
}