2013-05-02 1 views
1

Я хочу отправить запрос SOAP через SSL на сервер SOAP (сервер Microsoft IIS). Когда я тестирую запрос SOAP через инструмент soapUI с конфигурациями SSL - Keystore, он возвращает ответ правильно. Но, используя следующий код, он возвращает «HTTP/1.1 400 Bad Request» Я использовал httpclient-4.2.3 и httpcore-4.2.2.Проблема при отправке запроса SOAP в ApacheHttpClient с SSL

import java.security.KeyStore;  
import org.apache.http.Header;  
import org.apache.http.HttpEntity;  
import org.apache.http.HttpResponse;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.conn.scheme.Scheme;  
import org.apache.http.conn.scheme.SchemeRegistry;  
import org.apache.http.conn.ssl.SSLSocketFactory;  
import org.apache.http.entity.StringEntity;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.impl.conn.BasicClientConnectionManager;  
import org.apache.http.params.BasicHttpParams;  
import org.apache.http.params.HttpParams;  
import org.apache.http.util.EntityUtils; 


public final static void main(String[] args) throws Exception { 
     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     try { 

     KeyStore keyStore = KeyStore.getInstance("JKS"); 
     FileInputStream instream1 = new FileInputStream(new File("C:\\CCDKeyStore\\mykeystore.jks")); 
     try { 
      keyStore.load(instream1, "1214524".toCharArray()); 

     } finally { 
      try { instream1.close(); } catch (Exception ignore) {} 
     } 

     SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore,"1214524"); 
     Scheme sch = new Scheme("https", 443, socketFactory); 
     SchemeRegistry schemeRegistry = httpclient.getConnectionManager().getSchemeRegistry(); 
     schemeRegistry.register(sch); 

     final HttpParams httpParams = new BasicHttpParams(); 
     DefaultHttpClient lHttpClient = new DefaultHttpClient(new BasicClientConnectionManager(schemeRegistry), httpParams); 

     String lUrl = "https://api.demo.server.com/XDS/Service.svc?wsdl"; 

     StringBuffer lXmlBuffer = new StringBuffer(); 

     lXmlBuffer.append("<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\">\n"); 
     lXmlBuffer.append("<s:Header>\n"); 
     lXmlBuffer.append("<a:Action s:mustUnderstand=\"1\">urn:74347:4757:StoredQuery</a:Action>\n"); 
     lXmlBuffer.append("<a:MessageID>urn:uuid:c6430690-412e-4744-afe1-233e2138f2d2</a:MessageID>\n"); 
     . 
     . 
     . 
     . 
     . 
     . 
     lXmlBuffer.append("</Slot>\n"); 
     lXmlBuffer.append("</AdhocQuery>\n");    
     lXmlBuffer.append("</query:AdhocQueryRequest>\n"); 
     lXmlBuffer.append("</s:Body>\n"); 
     lXmlBuffer.append("</s:Envelope>\n");   


     String lXml = lXmlBuffer.toString(); 


     HttpPost lMethod = new HttpPost(lUrl); 
     HttpEntity lEntity = new StringEntity(lXml, "multipart/related", "utf-8"); 

     lMethod.setHeader("SOAPAction", "urn:74347:4757:StoredQuery"); 
     System.out.println(EntityUtils.toString(lEntity)); 
     lMethod.setEntity(lEntity); 

     HttpResponse lHttpResponse = lHttpClient.execute(lMethod); 




     } finally { 

      httpclient.getConnectionManager().shutdown(); 
     } 

Любая помощь на этом высоко ценим

Спасибо, Mohan

+0

Вы уверены, что конверт SOAP хорошо сформирован? – acdcjunior

+0

Да, когда я копирую и пропускаю тот же запрос SOAP, сгенерированный вышеуказанным классом, в soapUI, он возвращает ответ правильно ... – Mohan

ответ

0

Наконец-то я нашел ответ ...

Вот следующая строка в коде выше содержит тип контента как «многоголосных /Связанный". Но веб-служба ожидает тип контента «application/soap + xml», поскольку это запрос SOAP. Пожалуйста, обратитесь к w3schools tutorial для получения дополнительной информации

HttpEntity lEntity = new StringEntity (lXml, "multipart/related", "utf-8");