一、WebService接口正常使用SOAP協議調用,測試時常采用SoapUI軟件調用,具體如下:
二、由于目前主流web服務逐漸轉換為RESTful的形式,且SOAP協議的實現也是基于HTTP協議,故存在通過HTTP調用WebService接口的可能
2.1 打開對應的WebService地址,目的地址location即為HTTP REST方式需要調用的服務地址
2.2 在HTTP REST 請求頭中添加SOAPAction字段
SOAPAction 可以提供關于 SOAP 消息中要調用的具體操作或方法的信息。這對于接收方來說是非常重要的,因為它幫助確定如何解析和處理收到的 SOAP 消息
如果在發起 SOAP 請求時未在 SOAPAction 中提供有效的操作或方法信息,請求接收方可能會根據其他信息(例如消息體中的內容)來確定應該執行的操作,或者可能會采取默認行為來處理請求
此時SOAPAction可設置為空或者WSDL中對應的Operation(PACSreturn)
2.3 Body內容為xml格式,內容即為SoapUI調用時傳輸的全部內容
三、代碼實現
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Objects;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;@Service
public class PostSoap {// 請求超時時間static int socketTimeout = 10000;// 傳輸超時時間static int connectTimeout = 10000;public static String doPostSoap(String code, String message) {// 服務地址String webServiceURL = "http://10.146.8.226/csp/hsb/DHC.Published.PUB0007.BS.PUB0007.cls";// 拼接報文String soapXml ="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org\">\n"+ " <soapenv:Header/>\n"+ " <soapenv:Body>\n"+ " <tem:PACSreturn>\n"+ " <!--Optional:-->\n"+ " <tem:input1>" + code + "</tem:input1>\n"+ " <!--Optional:-->\n"+ " <tem:input2>" + message + "</tem:input2>\n"+ " </tem:PACSreturn>\n"+ " </soapenv:Body>\n"+ "</soapenv:Envelope> ";// 創建HttpClientHttpClientBuilder httpClientBuilder = HttpClientBuilder.create();CloseableHttpClient closeableHttpClient = httpClientBuilder.build();// 創建Post請求HttpPost httpPost = new HttpPost(webServiceURL);// 設置請求和傳輸超時時間RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();httpPost.setConfig(requestConfig);// 設置Post請求報文頭部httpPost.setHeader("Content-Type", "application/xml");httpPost.setHeader("SOAPAction", "");// 添加報文內容StringEntity data = new StringEntity(soapXml, Charset.forName("UTF-8"));httpPost.setEntity(data);try {// 執行請求獲取返回報文CloseableHttpResponse response = closeableHttpClient.execute(httpPost);HttpEntity httpEntity = response.getEntity();if (Objects.nonNull(httpEntity)) {// 打印響應內容System.out.println(EntityUtils.toString(httpEntity, "UTF-8"));}// 釋放資源closeableHttpClient.close();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}public static void main(String[] args) {String code = "接口001";String message = "報文xml";doPostSoap(code, message);}
}
運行結果