SpringBoot調用第三方WebService接口的操作技巧(.wsdl與.asmx類型)
SpringBoot調webservice接口,一般都會給你url如:
http://10.189.200.170:9201/wharfWebService/services/WharfService?wsdl
http://10.103.6.158:35555/check_ticket/Ticket_Check.asmx
其中.asmx是.net開發提供的webservice服務。
依賴
引入相關依賴:
<!-- webService--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <!-- CXF webservice --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.2.1</version> </dependency>
瀏覽webService提供的方法,確定入參順序 直接在瀏覽器裡面訪問url,如下
用SoapUI工具
用些是.asmx格式,也可以直接在瀏覽器訪問。會列出方法列表
代碼
創建client:
package com.gqzdev.sctads.configuration; import com.gqzdev.sctads.constant.CommonConstant; import lombok.extern.slf4j.Slf4j; 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 org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author gqzdev * @date 2021/08/26 15:53 **/ @Configuration @Slf4j public class JaxWsClientConfig { @Bean("JaxWsClient") public Client client() { // 創建動態客戶端 JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance(); //CommonConstant.PUBLIC_SECURITY_URL為連接的url,如http://10.189.200.170:9201/wharfWebService/services/WharfService?wsdl log.info("publicsecurity webService url : {}", CommonConstant.PUBLIC_SECURITY_URL); //創建client Client client = clientFactory.createClient(CommonConstant.PUBLIC_SECURITY_URL); HTTPConduit conduit = (HTTPConduit) client.getConduit(); HTTPClientPolicy policy = new HTTPClientPolicy(); policy.setAllowChunking(false); // 連接服務器超時時間 10秒 policy.setConnectionTimeout(10000); // 等待服務器響應超時時間 20秒 policy.setReceiveTimeout(20000); conduit.setClient(policy); return client; } }
有瞭client,便可以直接註入調用invoke。找到自己需要調用的方法:
下面隻展示一個方法的調用演示,其他的類似
package com.gqzdev.sctads.service.impl; import com.gqzdev.sctads.constant.CommonConstant; import com.gqzdev.sctads.service.PublicSecurityService; import lombok.extern.slf4j.Slf4j; import org.apache.cxf.endpoint.Client; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import javax.xml.namespace.QName; /** * @author gqzdev * @date 2021/08/26 15:24 **/ @Slf4j @Component public class PublicSecurityServiceImpl implements PublicSecurityService { @Autowired @Qualifier("JaxWsClient") private Client client; /** * 旅客登記 */ @Override // @Async public String chineseAddNew(Object... params) { // QName qname = new QName("service.", CommonConstant.CHINESE_ADD); try { Object[] invoke = client.invoke(CommonConstant.CHINESE_ADD, params); if (invoke != null && invoke.length >= 1) { String result = (String) invoke[0]; log.info("userAddNew result: {}", result); return result; } } catch (Exception e) { // e.printStackTrace(); log.error("invoke WS userAddNew method error: {}", e.getMessage()); } return null; } }
使用post請求訪問webservice接口
package com.gqzdev.sctads.service.impl; import cn.hutool.core.util.XmlUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.util.Map; /** * 對接票務系統驗證 * * @author gqzdev * @date 2021/08/25 17:07 **/ @Component @Slf4j public class TicketCheckServiceImpl implements TicketCheckService { @Autowired @Qualifier("nativeRestTemplate") private RestTemplate restTemplate; @Override public boolean ticketCheck(TicketRequestVO ticketRequestVO) { //構造請求參數xml Map objMap = JSONObject.toJavaObject(JSONObject.parseObject(JSON.toJSONString(ticketRequestVO)), Map.class); String objXml = XmlUtil.mapToXmlStr(objMap); String requestXml = objXml.replace("<xml>", "<MQ_MESSAGE>").replace("</xml>", "</MQ_MESSAGE>"); log.info("ticket request params xml: {}", requestXml); /** * 調用webservice請求 */ HttpHeaders headers = new HttpHeaders(); //header參數 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //請求參數 MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); //接口參數 map.add("msg", requestXml); //構造實體對象 HttpEntity<MultiValueMap<String, Object>> param = new HttpEntity<>(map, headers); //發送post請求webservice String response = restTemplate.postForObject(CommonConstant.TICKET_REQUEST_URL, param, String.class); log.info("ticket request response: {}", response); /** * 解析返回xml,返回是否認證成功 */ String responseXml = XmlUtil.unescape(response); Map<String, Object> resultMap = XmlUtil.xmlToMap(responseXml); TicketResponseVO ticketResponseVO = JsonUtil.map2pojo(resultMap, TicketResponseVO.class); //0開閘 ,1不開閘 if (ticketResponseVO.getMQ_MESSAGE().getMSG_BODY().getCOMMAND() == 0) { return true; } return false; } }
XML相關操作
關於xml解析處理,這邊推薦使用hutool裡面的XmlUtil
到此這篇關於SpringBoot調用第三方WebService接口(.wsdl與.asmx類型 )的文章就介紹到這瞭,更多相關SpringBoot WebService接口內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot整合WebService服務的實現代碼
- java調用webservice的.asmx接口的使用步驟
- SpringBoot項目使用 axis 調用webservice接口的實踐記錄
- springboot實現mock平臺的示例代碼
- 解決SpringCloud Config結合github無法讀取配置的問題