1. 程式人生 > 其它 >webservice客戶端asmx

webservice客戶端asmx

技術標籤:JAVAwebserviceasmx

記錄一次webservice介面訪問服務端一般會給個以http://xxx/services.asmx。

以前都是wsdl做服務端,採用idea自帶的工具生成客戶端或者用wsdl2java工具生成。

從網上找了好多方法,最後終於成功了。

服務端的URL:

asmx的請求與響應程式碼:

<!--請求-->
POST /webService/services/webServiceImplService.asmx HTTP/1.1
Host: 172.16.1.20
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://webService/services/webServiceImplService/SendInfo"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <SendInfo xmlns="http://webService/services/webServiceImplService">
      <Data>string</Data>
    </SendInfo>
  </soap:Body>
</soap:Envelope>
<!--響應-->
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <SendInfoResponse xmlns="http://webService/services/webServiceImplService">
      <SendInfoResult>string</SendInfoResult>
    </SendInfoResponse>
  </soap:Body>
</soap:Envelope>

方法一

asmx也可以用wsdl2java工具生成。就在http://xxx/services.asmx後加?wsdl即可。生成方式可百度,有很多。如果這麼簡單我就不會寫這篇文章了/哭

我這個服務端地址裡面包含了很多方法。其中有引數是重複的,導致用wsdl2java工具生成時一直報某某欄位重複。我從網上找了個asmx檔案是可以用wsdl2java生成的。所以這個方法是沒法用的。

方法二

直接使用org.apache.axis.client.ServiceCall。程式碼如下:

public static void main(String[] args) throws Exception {
    String url = "http://ip:port/webService/services/webServiceImplService.asmx";
    //這裡有個坑,一定要注意最後是否有反斜線!!!
    String namespace = "http://webService/services/webServiceImplService";
    //action路徑(方法名)
    String actionUri = "SendInfo";
    //方法名
    String op = "SendInfo";

    Service service = new Service();
	Call call = (Call) service.createCall();
	call.setTargetEndpointAddress(new URL(url));
	call.setUseSOAPAction(true);
    // 在建立QName物件時,QName類的構造方法的第一個引數表示WSDL檔案的名稱空間名,也就是<wsdl:definitions>元素的targetNamespace屬性值
	call.setSOAPActionURI(namespace +"/"+actionUri);
	call.setReturnType(XMLType.XSD_STRING);
	call.setOperationName(new QName(namespace, op)); // 設定要呼叫哪個方法
	call.addParameter(new QName(namespace,"Data"), // 設定要傳遞的引數(形參)
	XMLType.XSD_STRING, ParameterMode.IN);

    String json = "傳遞的資料";
    Object[] params = new Object[]{json};
    String response = "";
    try {
			response = (String) call.invoke(params);// 呼叫方法並傳遞引數
		}catch (Exception e){
			e.printStackTrace();
			//輸出SOAP傳送的請求報文
			System.out.println("--SOAP Request: " +     call.getMessageContext().getRequestMessage().getSOAPPartAsString());
		}
}