【问题标题】:How to send SOAP request over HTTP use digest authentication HTTP in Java (or C#)?如何通过 HTTP 使用 Java(或 C#)中的摘要身份验证 HTTP 发送 SOAP 请求?
【发布时间】:2015-03-05 10:31:01
【问题描述】:

我有网址为http://192.168.0.10/services/abc?wsdl的网络服务
此 Web 服务器使用摘要身份验证,用户名为 admin,密码为 admin
我想将请求跟随发送到此服务器

SOAP 请求 XML 是 SOAP_RQ.XML

 <soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:log="LogsGet" xmlns:mal="MalteseGlobal" xmlns:job="JobGlobal">
         <soapenv:Body>
             <log:LogsGetReq Cmd="Start" OpV="01.00.00" Sev="Info to critical"/>
          </soapenv:Body>
</soapenv:Envelope>     


我的代码:

 private static SOAPMessage createSOAPRequest(String username, String password) throws Exception {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();
        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("log", "LogsGet");
        envelope.addNamespaceDeclaration("mal", "MalteseGlobal");
        envelope.addNamespaceDeclaration("job", "JobGlobal");
        // SOAP Body
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("LogsGetReq", "log");
        QName Cmd = new QName("Cmd");
        QName OpV = new QName("OpV");
        QName Sev = new QName("Sev");
        soapBodyElem.addAttribute(Cmd, "Start");
        soapBodyElem.addAttribute(OpV, "01.00.00");
        soapBodyElem.addAttribute(Sev, "Info to critical");
        //SOAP Header
        MimeHeaders hd = soapMessage.getMimeHeaders();
        hd.addHeader("UsernameToken", username);
        hd.addHeader("PasswordText", password);

        soapMessage.saveChanges();       
        return soapMessage;
    }

public void sendSoapRequest(String url, String username, String password) {
        try {
            // Create SOAP Connection
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection soapConnection = soapConnectionFactory.createConnection();

            // Send SOAP Message to SOAP Server         
            SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(username, password, txtArea), url);
            // Process the SOAP Response               
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            soapResponse.writeTo(bos);
            System.out.println();  
            soapConnection.close();

        } catch (Exception e) {
            System.out.println("Error occurred while sending SOAP Request to Server");              
            e.printStackTrace();
        }
    }

当我发送请求时,我收到以下消息: 错误响应:(需要 401 授权)

如果我发送请求,请使用 curl 工具 (http://curl.haxx.se/download/curl-7.41.0.zip) 命令行: curl.exe -X POST http://192.168.0.10/services/Maltese -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction:LogsGet" --digest -u admin:admin -d @SOAP_RQ.xml -v
我收到消息回复正常。

任何人都可以帮助我,如何使用 JAVA(或 C#)通过 HTTP 发送 SOAP 请求?

谢谢

【问题讨论】:

    标签: java xml soap wsdl digest-authentication


    【解决方案1】:
    // I used Apache HttpClient.
    // For URL, you need to find end point URL.
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    
    // Input parameter
    String username = "";
    String password = "";
    String url = "";
    
    // Variables 
    int responseCode = 0;
    String errorMessage = "";
    String responseContent = "";
    String content = ""
    
    HttpResponse response;
    
    try
    {
        content = 
            "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:log=\"LogsGet\" xmlns:mal=\"MalteseGlobal\" xmlns:job=\"JobGlobal\">" + 
            "\n  <soapenv:Body>" +
            "\n    <log:LogsGetReq Cmd=\"Start\" OpV=\"01.00.00\" Sev=\"Info to critical\"/>" + 
            "\n  </soapenv:Body>" +
            "\n</soapenv:Envelope>";
    
        // Create the POST object and add the parameters
        HttpPost httpPost = new HttpPost(url);
        httpPost.addHeader("Content-Type", "text/xml; charset=utf-8");
    
        // Enable preemptive authentication within HttpClient so that HttpClient will 
        // send the basic authentications reponse before the server gives an unauthorized reponse. 
        String host = httpPost.getURI().getHost();
        int port = httpPost.getURI().getPort();   
        AuthScope authScope = new AuthScope(host, port);
        DefaultHttpClient httpClient = new DefaultHttpClient();
        UsernamePasswordCredentials credentials = new     UsernamePasswordCredentials(username, password);
        httpClient.getCredentialsProvider().setCredentials(authScope, credentials);   
    
        StringEntity input = new StringEntity(content);
        input.setContentType("application/json");
        httpPost.setEntity(input);   
        response = httpClient.execute(httpPost);
    
        if (response != null && response.getStatusLine() != null)
        {
            responseCode = response.getStatusLine().getStatusCode();
            responseContent = EntityUtils.toString(response.getEntity());
        }
    
        System.out.println("\n\n-----------------------------");
        System.out.println("\nResponse code: " + responseCode);
        System.out.println("\nResponse content: " + responseContent);
    }
    catch (Exception e)
    {
        errorMessage  += "\nUnexpected Exception: " + e.getMessage();
        StringWriter sWriter = new StringWriter();
        PrintWriter pWriter = new PrintWriter(sWriter, true);
        e.printStackTrace(pWriter);
        errorMessage += "\n" + sWriter.getBuffer().toString();
    
        errorMessage += "\n------------Error Detail------------";
        errorMessage += "\n" + e;
        errorMessage += "\n" + e.getMessage();
        errorMessage += "\n" + e.getLocalizedMessage();
        errorMessage += "\n" + e.getCause();
        errorMessage += "\n" + Arrays.toString(e.getStackTrace());
        errorMessage += "\n" + e.printStackTrace();
        errorMessage += "\n------------------------------------";
    }
    finally
    {
        if(response)
        {
            EntityUtils.consume(response.getEntity());    
        }
    }
    
    if(errorMessage != "")
    {
        System.out.println("Error: " + errorMessage);
    } 
    

    【讨论】:

      【解决方案2】:

      如果使用 C#
      我创建成功
      我的代码:

      private  string WebServiceCall(string url)
              {
                  try
                  {
                      Uri myUrl = new Uri(url);
                      WebRequest webRequest = WebRequest.Create(myUrl);
                      HttpWebRequest httpWebRequest = (HttpWebRequest)webRequest;
                      httpWebRequest.Method = "POST";
                      httpWebRequest.ContentType = "text/xml; charset=utf-8";
                      httpWebRequest.Headers.Add("SOAPAction: LogsGet");
                      httpWebRequest.ProtocolVersion = HttpVersion.Version11;
      
                      //Credentials
                      NetworkCredential myNetworkCredential = new NetworkCredential("admin", "admin");
                      CredentialCache myCredentialCache = new CredentialCache();
                      myCredentialCache.Add(myUrl, "Digest", myNetworkCredential);
                      httpWebRequest.PreAuthenticate = true;
                      httpWebRequest.Credentials = myNetworkCredential;
                      Stream requestStream = httpWebRequest.GetRequestStream();
                      //Create Stream and Complete Request             
                      StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.ASCII);
      
                      StringBuilder soapRequest = new StringBuilder("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" ");
                      soapRequest.Append("xmlns:log=\"LogsGet\" xmlns:mal=\"MalteseGlobal\" xmlns:job=\"JobGlobal\">");
                      soapRequest.Append("<soapenv:Body>");
                      soapRequest.Append("<log:LogsGetReq Cmd=\"Start\" OpV=\"01.00.00\" Sev=\"Info to critical\"/>");
                      soapRequest.Append("</soapenv:Body></soapenv:Envelope>");
      
                      streamWriter.Write(soapRequest.ToString());
                      streamWriter.Close();
                      //Get the Response    
                      txtRequest.Text = soapRequest.ToString();
                      HttpWebResponse wr = (HttpWebResponse)httpWebRequest.GetResponse();
                      StreamReader srd = new StreamReader(wr.GetResponseStream());
                      string resulXmlFromWebService = srd.ReadToEnd();
                      return resulXmlFromWebService;
                  }
                  catch (Exception e)
                  {
                      return e.ToString();
                  }
              }
      

      【讨论】:

      • 如果你会用Java写代码,你可以在这个话题上发帖。
      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2020-11-21
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多