当前位置: 首页 > news >正文

Webservice如何调用

webservice调用方式:

(1)http方式调用

请求头增加Content-type:text/xml 或application/soap+xml

SOAPAction:方法名

请求body以xml字符串传递,xml格式定义

返回以xml字符串返回,xml某个字段是一个json字符串。

入参如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dhcc="http://www.dhcc.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <dhcc:方法名>
         <!--Optional:-->
         <dhcc:inputJsonStream><![CDATA[
json串...
]]></dhcc:inputJsonStream>
      </dhcc:方法名>
   </soapenv:Body>
</soapenv:Envelope>

curl -XPOST -H 'Content-Type:text/xml' -d '<xml></xml>'  webserviceurl

 curl -X POST -H 'Content-Type:application/soap+xml' -d @test.xml  webserviceurl,其中xml文件以本地文件的方式传递

   public static String callWebService(String webserviceurl, String method, String sendMsg, String contentType) {
        String retStr = "";
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
        HttpPost httpPost = new HttpPost(webserviceurl);

        // 设置请求和传输超时时间
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(3000)
                .setConnectTimeout(3000).build();
        httpPost.setConfig(requestConfig);

        try {
            httpPost.setHeader("Content-Type", contentType);
            httpPost.setHeader("SOAPAction", method);
            StringEntity data = new StringEntity(sendMsg,
                    Charset.forName("UTF-8"));
            httpPost.setEntity(data);
            CloseableHttpResponse response = closeableHttpClient
                    .execute(httpPost);
            HttpEntity httpEntity = response.getEntity();
            if (httpEntity != null) {
                retStr = EntityUtils.toString(httpEntity, "UTF-8");
                logger.debug("url:{} ret:{}", url, retStr);
                return retStr;
            }

        } catch (Exception e) {
            logger.error("callWebService", e);
        } finally {
            // 释放资源
            try {
                closeableHttpClient.close();
            } catch (IOException e) {
                logger.error("close", e);
            }
        }
        return null;
    }

(2)通过apache的webservice工具调用

Client client = WsClientUtil.getClient(notifyUrl);
        try {
            Object[] objects = client.invoke(method, getjson());
            if (objects != null) {
                result = (String)objects[0];
                log.info(result);
                log.info("耗时:" +(System.currentTimeMillis() - start));
            }
        } catch (Exception e) {
            throw new RuntimeException("WebSocket请求异常");
        }
    }
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 获取Client
 */
public class WsClientUtil {

    private static final JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();

    private static final Map<String, Client> clientMap = new ConcurrentHashMap(256);

    public static Client getClient(String wsUrl) {
        // 创建动态客户端
//        JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
        //根据WebServices接口地址创建client
        if (clientMap.get(wsUrl) == null) {
            synchronized (WsClientUtil.class) {
                if (clientMap.get(wsUrl) == null) {
                    Client client = clientFactory.createClient(wsUrl);
                    HTTPConduit conduit = (HTTPConduit) client.getConduit();
                    HTTPClientPolicy policy = new HTTPClientPolicy();
                    policy.setAllowChunking(false);
                    // 连接服务器超时时间 3秒
                    policy.setConnectionTimeout(5000);
                    // 等待服务器响应超时时间 3秒
                    // 等待服务器响应超时时间 3秒
                    policy.setReceiveTimeout(5000);
                    conduit.setClient(policy);
                    clientMap.put(wsUrl, client);
                    return client;
                }
            }
        }
        return clientMap.get(wsUrl);
    }
}

但今天测试时,使用curl -X POST -H 'Content-Type:application/soap+xml' -d '' 可以通,用java客户端调用就报错。。

相关文章:

  • zabbix学习笔记
  • 前端开发:Web蜜罐详解
  • Java实例化详解:从概念到实践的全方位解读
  • 如何把绿色可执行应用程序添加到Ubuntu的收藏夹Dock中
  • 【DvAdmin】基于腾讯云Cos实现资源预签名访问
  • 硬件工程师入门教程(四)
  • k8s面试题总结(十五)
  • Windows本地部署DeepSeek模型指南
  • react native
  • 前端 JavaScript 中快速发起多个下载请求时,解决浏览器的并发下载连接限制
  • 数字人源码部署-支持oem
  • Netty基础—4.NIO的使用简介二
  • 编程考古-VCL跨平台革命:CrossVCL如何让Delphi开发者梦想成真(上)
  • 从 pip 到 Poetry:开启高效 Python 包管理新时代
  • LVGL 中设置 UI 层局部透明,显示下方视频层
  • 1720. 解码异或后的数组
  • 大型语言模型与强化学习的融合:迈向通用人工智能的新范式
  • Unity3D IK 解算器(Inverse Kinematics,IK Solver)
  • 双指针算法介绍+算法练习(2025)
  • 程序化广告行业(12/89):需求方与需求方服务深度剖析
  • 巴达玛·利斯瓦达恭当选世界羽联主席,张军任理事会理事
  • 首映|马丽:真想抱抱臧姑娘,对她说辛苦了
  • 在县中,我看到“走出去”的渴望与“留下来”的惯性
  • 从中央政治局会议看经济工作着力点:以高质量发展的确定性应对外部不确定性
  • 临沂文旅集团被诉侵权,原告每年三百余起类案
  • 魔都眼·上海车展⑤|被主播包围的新车