RestTemplate调用Webservice接口
restTemplate的方式主要就是拼接xml,利用soapUI打开webservice连接之后,可以看到界面话的xml的格式,通过代码层手动构建拼接xml,然后再去发起请求。
***ps:不同的webservice对应的xml是不同的,看具体soapUI中服务的格式***
开启restTemplate
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(3000);
factory.setConnectTimeout(9000);
return factory;
}
}
方法实现(部分代码)
model对象
@Data
public class HttpRequestDto {
// 服务地址
private String url;
// 命名空间
private String nameSpace;
// 具体服务名
private String service;
// 请求体
private JSONObject body;
// 请求头
private Map<String, String> header = new HashMap<>();
}
@Service
public class WebServiceImpl {
@Autowired
private RestTemplate restTemplate;
public JSONObject sendWebService (HttpRequestDto httpRequestDto) {
String url = httpRequestDto.getUrl();
String nameSpace = httpRequestDto.getNameSpace();
// 创建对象用于xml的拼接
StringBuffer soapRequestData = new StringBuffer("");
soapRequestData.append("<soapenv:Envelop xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"" + nameSpace + "\">");
// 如果xml有请求头
Map<String, String> headerMap = httpRequestDto.getHeader();
if (null != headerMap && !headerMap.isEmpty()) {
soapRequestData.append("<soapenv:Header>");
soapRequestData.append("tns:RequestSOAPHeader xmlns:tns\"" + headerMap.get("RequestSOAPHeader") + "\">");
for(Map.Entry<String, String> entry : headerMap.entrySet()) {
soapRequestData.append("<tns:" + entry.getKey() + ">");
soapRequestData.append(entry.getValue());
soapRequestData.append("</tns:" + entry.getKey() + ">");
}
soapRequestData.append("</tns:RequestSOAPHeader>");
soapRequestData.append("</soapenv:Header>");
} else {
soapRequestData.append("<soapenv:Header/>");
}
// body
soapRequestData.append("<soapenv:Body>");
String service = httpRequestDto.getService();
soapRequestData.append("<web:" + service + ">");
soapRequestData.append("<arg0>");
JSONObject body = httpRequestDto.getBody();
Iterator<String> bodyIterator = body.keySet().iterator();
while(bodyIterator.hasNext()) {
String key = bodyIterator.nect();
String value = body.getString(key);
soapRequestData.append("<" + key + ">");
soapRequestData.append(value);
soapRequestData.append("</" + key + ">");
}
soapRequestData.append("</arg0>");
soapRequestData.append("</web:" + service + ">");
soapRequestData.append("</soapenv:Body>");
soapRequestData.append("</soapenv:Envelope>");
// 设置http请求头
HttpHeaders headers = new HttpHeaders();
MediaType mediaType = MediaType.parseMediaType("text/xml;charset=UTF-8");
headers.setContentType(mediaType);
HttpEntity<String> httpEntity = new HttpEntity<>(soapRequestData.toString(), headers);
// 结果打印出来,自行截取解析即可
String reslut = restTemplate.postForObject(url, httpEntity, String.class);
}
}
soapRequestData对象为手动拼接的完整xml,打开soapUI可以进行对比发起访问测试,只要构建出相同的xml格式就能发起