JAVA调用C语言发布的webservice接口

JAVA调用C语言发布的webservice接口,第1张

Java调用WebService可以直接使用Apache提供的axisjar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。
1、编写代码方式:

package comyuduntest;
import javarmiRemoteException;
import orgapacheaxisclientCall;
import orgapacheaxisclientService;
import orgapacheaxismessagePrefixedQName;
import orgapacheaxismessageSOAPHeaderElement;
import comcezannegoldenuserException;
import comcezannegoldenuserUserManagerServiceProxy;
import javaxxmlnamespaceQName;
import javanetMalformedURLException;
import javaxxmlrpcServiceException;
import javaxxmlsoapName;
import javaxxmlsoapSOAPException;
public class testWebService {
public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException
  {
     //标识Web Service的具体路径
   String endpoint = "WebService服务地址";
     // 创建 Service实例
    Service service = new Service();   
     // 通过Service实例创建Call的实例
    Call call = (Call) servicecreateCall();
    //将Web Service的服务路径加入到call实例之中
    callsetTargetEndpointAddress( new javanetURL(endpoint) );//为Call设置服务的位置
   // 由于需要认证,故需要设置调用的SOAP头信息。   
    Name headerName = new PrefixedQName( new QName("发布的wsdl里的targetNamespace里的url", "string_itemName") ); 
          orgapacheaxismessageSOAPHeaderElement header = new SOAPHeaderElement(headerName); 
          headeraddTextNode( "blablabla" ); 
          calladdHeader(header);
          
//    SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("发布的wsdl里的targetNamespace里的url", "SoapHeader");   
//    soapHeaderElementsetNamespaceURI("发布的wsdl里的targetNamespace里的url");   
//    try  
//    {   
//        soapHeaderElementaddChildElement("string_itemName")setValue("blablabla");   
//    }   
//    catch (SOAPException e)   
//    {   
//        eprintStackTrace();   
//    }   
//    calladdHeader(soapHeaderElement);  
    //调用Web Service的方法
          orgapacheaxisdescriptionOperationDesc oper;
          orgapacheaxisdescriptionParameterDesc param;
          oper = new orgapacheaxisdescriptionOperationDesc();
          opersetName("opName");
          param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg0"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName(", "string"), javalangStringclass, false, false);
          paramsetOmittable(true);
          operaddParameter(param);
          param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg1"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName(", "string"), javalangStringclass, false, false);
          paramsetOmittable(true);
          operaddParameter(param);
          param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg2"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName(", "string"), javalangStringclass, false, false);
          paramsetOmittable(true);
          operaddParameter(param);
          opersetReturnType(new javaxxmlnamespaceQName(", "string"));
          opersetReturnClass(javalangStringclass);
          opersetReturnQName(new javaxxmlnamespaceQName("", "return"));
          opersetStyle(orgapacheaxisconstantsStyleWRAPPED);
          opersetUse(orgapacheaxisconstantsUseLITERAL);
          operaddFault(new orgapacheaxisdescriptionFaultDesc(
                        new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "Exception"),
                        "Exception",
                        new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "Exception"), 
                        true
                       ));
   callsetOperation( oper );
   callsetOperationName(new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "opName"));
    //调用Web Service,传入参数
   String res = ( String ) callinvoke( new Object[]("arg0","arg1"));
   Systemoutprintln("===============");
   return res;
  }
/
   @param args
  /
 public static void main(String[] args) {
  try {
   Systemoutprintln(getResult());
  } catch (MalformedURLException e) {
   eprintStackTrace();
  } catch (RemoteException e) {
   eprintStackTrace();
  } catch (ServiceException e) {
   eprintStackTrace();
  } catch (SOAPException e) {
   eprintStackTrace();
  }
    }
}
2、利用Eclipse自动生成WebService client代码就容易多了:
首先,new project,选择other,在输入框中输入Web Service Client,选中搜索后的结果,点击Next,在Service definition中输入 WebService的发布地址,点击Finish
这样,WebService Client代码已经生成好了。
接下来写一个Test类,在main函数中输入如下代码:

String endpoint = "服务器的WebService的地址";
 YourWebServiceNameProxy umsp = new YourWebServiceNameProxy (endpoint);
 try {
 String resultStr = umspopMethod("arg0","arg1");
 Systemoutprintln(resultStr);
 } catch (Exception e) {
 Systemoutprintln("异常");
 eprintStackTrace();
} catch (RemoteException e) {
 Systemoutprintln("RemoteException异常");
 eprintStackTrace();
}

生成webservice客户端的解决办法 JDK自带wsimport命令 wsimport命令在JDK16及以上版本中自带该工具,所以如果想使用本方式须安装JDK16及其以上的版本。 打开cmd命令窗口,快捷方式为window+r组合键。打开cmd窗口后,通过wsimport命令生成webs

只映射A的地址是可行的,因为对其他服务器的调用是通过A,而不是通过公网。

我觉得应该是只映射了80端口的问题,A发布的webservice是用的什么端口?是80端口么?如果不是,那显然是被防火墙限制了,所以会报无法连接。

在服务端写一个专门针对文件的方法,客户端参数类型可以是Byte/DataHandler等类型,在服务端进行解析参数写入文件即可。最重要的是要设置WebService为可传递附件,默认的WebService仅仅支持一般数据类型的传递。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13455649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-10
下一篇 2023-08-10

发表评论

登录后才能评论

评论列表(0条)

保存