簡體   English   中英

無法使用Java客戶端訪問Asmx Soap Web服務

[英]Not able to access asmx soap web service using java client

我正在嘗試使用java訪問asmx Web服務:wsdl如下所示:

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://infotelconnect.com/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://infotelconnect.com/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://infotelconnect.com/">
<s:element name="chk_mob">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="directorynumber" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="email" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="alternate" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="chk_mobResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="chk_mobResult" type="tns:Responsevalid"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="Responsevalid">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="errcd" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="err" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="subaccnum" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="accnum" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="altnum" type="s:string"/>
</s:sequence>
</s:complexType>
<s:element name="AuthHeader" type="tns:AuthHeader"/>
<s:complexType name="AuthHeader">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="IP" type="s:string"/>
</s:sequence>
<s:anyAttribute/>
</s:complexType>
</s:schema>
</wsdl:types>
<wsdl:message name="chk_mobSoapIn">
<wsdl:part name="parameters" element="tns:chk_mob"/>
</wsdl:message>
<wsdl:message name="chk_mobSoapOut">
<wsdl:part name="parameters" element="tns:chk_mobResponse"/>
</wsdl:message>
<wsdl:message name="chk_mobAuthHeader">
<wsdl:part name="AuthHeader" element="tns:AuthHeader"/>
</wsdl:message>
<wsdl:portType name="DNvalidationSoap">
<wsdl:operation name="chk_mob">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Validate Directory Number!</wsdl:documentation>
<wsdl:input message="tns:chk_mobSoapIn"/>
<wsdl:output message="tns:chk_mobSoapOut"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="DNvalidationSoap" type="tns:DNvalidationSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="chk_mob">
<soap:operation soapAction="http://infotelconnect.com/chk_mob" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:chk_mobAuthHeader" part="AuthHeader" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="DNvalidationSoap12" type="tns:DNvalidationSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="chk_mob">
<soap12:operation soapAction="http://infotelconnect.com/chk_mob" style="document"/>
<wsdl:input>
<soap12:body use="literal"/>
<soap12:header message="tns:chk_mobAuthHeader" part="AuthHeader" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="DNvalidation">
<wsdl:port name="DNvalidationSoap" binding="tns:DNvalidationSoap">
<soap:address location="https://202.164.33.157:7074/DNvalidation.asmx"/>
</wsdl:port>
<wsdl:port name="DNvalidationSoap12" binding="tns:DNvalidationSoap12">
<soap12:address location="https://202.164.33.157:7074/DNvalidation.asmx"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

NetBeans生成的我的客戶代碼如下:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.eclat.client;

import com.sun.xml.ws.security.soap12.Header;
import com.sun.xml.wss.XWSSConstants;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFactory;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.MessageContext;
import org.eclat.vtlservice.AuthHeader;
import org.eclat.vtlservice.Responsevalid;
import org.eclat.vtlservice.DNvalidation;
import org.eclat.vtlservice.DNvalidationSoap;

/**
 *
 * @author surjit
 */
public class Client {

    private static final String WS_URL = "https://202.164.33.157:7074/DNvalidation.asmx?WSDL";


    private static void trustEveryone() { 
     try { 
             HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){ 
                     public boolean verify(String hostname, SSLSession session) { 
                             return true; 
                     }}); 
             SSLContext context = SSLContext.getInstance("TLS"); 
             context.init(null, new X509TrustManager[]{new X509TrustManager(){ 
                     public void checkClientTrusted(X509Certificate[] chain, 
                                     String authType) throws CertificateException {} 
                     public void checkServerTrusted(X509Certificate[] chain, 
                                     String authType) throws CertificateException {} 
                     public X509Certificate[] getAcceptedIssuers() { 
                             return new X509Certificate[0]; 
                     }}}, new SecureRandom()); 
             HttpsURLConnection.setDefaultSSLSocketFactory( 
                             context.getSocketFactory()); 
     } catch (Exception e) { // should never happen 
             e.printStackTrace(); 
     } 
 }

    public static  Responsevalid chkMob(String directorynumber, String email, String alternate) {

        DNvalidation service = new org.eclat.vtlservice.DNvalidation();
        DNvalidationSoap port = service.getDNvalidationSoap();

        Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();

        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);
        Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>();
        requestHeaders.put("Username", Collections.singletonList("username"));
        requestHeaders.put("Password", Collections.singletonList("password"));
        requestHeaders.put("IP", Collections.singletonList("IP"));
        requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

        return port.chkMob(directorynumber, email, alternate);

    }

    public static void main(String args[]) {  
        trustEveryone();
       System.out.println(chkMob("parameter1","parameter2","parameter3")); 
    }

}


But when I am running this code..I am getting following error:



Jan 16, 2014 5:38:47 PM [com.sun.xml.ws.policy.jaxws.PolicyConfigParser]  parse
INFO: WSP5018: Loaded WSIT configuration from file: file:/E:/New%20Workspace/src/service/build/web/WEB-INF/classes/META-INF/wsit-client.xml.
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at DNvalidation.chk_mob(String directorynumber, String email, String alternate) in d:\QTLAPI\App_Code\DNvalidation.cs:line 57
   --- End of inner exception stack trace ---
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:189)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:122)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:140)
    at com.sun.proxy.$Proxy37.chkMob(Unknown Source)
    at org.eclat.client.Client.chkMob(Client.java:85)`enter code here`
    at org.eclat.client.Client.main(Client.java:91)
Java Result: 1

請提出任何解決方案,以便我能夠訪問此Web服務。

請優化您的代碼,因為此Web服務的請求消息格式不正確。 我認為這條線引起了問題。

return port.chkMob(directorynumber, email, alternate);

首先,這是一個肥皂網絡服務,您的請求消息結構應如下所示,

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:inf="http://infotelconnect.com/">
   <soapenv:Header>
      <inf:AuthHeader>
         <!--Optional:-->
         <inf:Username>?</inf:Username>
         <!--Optional:-->
         <inf:Password>?</inf:Password>
         <!--Optional:-->
         <inf:IP>?</inf:IP>
      </inf:AuthHeader>
   </soapenv:Header>
   <soapenv:Body>
      <inf:chk_mob>
         <!--Optional:-->
         <inf:directorynumber>?</inf:directorynumber>
         <!--Optional:-->
         <inf:email>?</inf:email>
         <!--Optional:-->
         <inf:alternate>?</inf:alternate>
      </inf:chk_mob>
   </soapenv:Body>
</soapenv:Envelope>

在這里,您將形成標題,

Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();

    requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);
    Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>();
    requestHeaders.put("Username", Collections.singletonList("username"));
    requestHeaders.put("Password", Collections.singletonList("password"));
    requestHeaders.put("IP", Collections.singletonList("IP"));
    requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

但是在調用網絡服務操作chk_mob時,

return port.chkMob(directorynumber, email, alternate);

您只提供了parameter1,parameter2,parameter3作為字符串,這是您在main方法的這一行中提供的,

System.out.println(chkMob("parameter1","parameter2","parameter3"));

首先制作一個我上面已經提到的適當的肥皂信封,然后通過在該調用中提供您的肥皂信封來進行網絡服務調用。 您可以在線為此Java客戶端找到大量示例和教程。 僅供參考,我已經使用soapui來生成您的請求消息結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM