2012-04-09 16 views
6

que utiliza el siguiente código C# de Microsoft para solicitar EWS 2010 MSDN link y funcionó. Necesito la misma solución para Android.Solicitud de servicios web de Exchange 2007/2010 con jabón + XML a través de HTTPS en Android

He intentado utilizar el siguiente código pero no ayuda

DefaultHttpClient client = new HttpsClient(
       MyActivity.this); 

     requestBytes = myXMLStringRequest.getBytes("UTF-8"); 

     HttpPost httpPost = new HttpPost(url); 
     httpPost.setHeader("Content-Type", "text/xml;utf-8"); 
     if (requestBytes != null) { 
      httpPost.setHeader("Content-length", 
        String.valueOf(requestBytes.length)); 
      Log.d(TAG, "content length: " + requestBytes.length); 
     } 

     client.getCredentialsProvider().setCredentials(
       new AuthScope(url, 443), 
       new UsernamePasswordCredentials(userName, 
         password)); 
     Log.d(TAG, "Begin request"); 
     HttpResponse response = client.execute(httpPost); 
     Log.d(TAG, "status Line: " + response.getStatusLine().toString()); 

Aquí está mi solicitud XML

<?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/" 
xmlns="http://schemas.microsoft.com/exchange/services/2006/messages" 
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
<soap:Body> 
<GetFolder xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"    xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
<FolderShape>  
    <t:BaseShape>Default</t:BaseShape> 
</FolderShape>  
<FolderIds>  
    <t:DistinguishedFolderId Id="inbox"/>  
    <t:DistinguishedFolderId Id="deleteditems"/> 
</FolderIds> 
</GetFolder> 

También uso encargo HttpsClient con almacén de claves.

public class HttpsClient extends DefaultHttpClient { 
private final Context context; 

public HttpsClient(final Context context) { 
    super(); 
    this.context = context; 
} 

/** 
* The method used to create client connection manager 
*/ 
@Override 
protected ClientConnectionManager createClientConnectionManager() { 
    final SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 8080)); 

    // Register for port 443 our SSLSocketFactory with our keystore 
    // to the ConnectionManager 
    registry.register(new Scheme("https", newSslSocketFactory(), 8443)); 
    return new SingleClientConnManager(getParams(), registry); 
} 

private SSLSocketFactory newSslSocketFactory() { 
    try { 
     // Get an instance of the Bouncy Castle KeyStore format 
     final KeyStore trusted = KeyStore.getInstance("BKS"); 
     // Get the raw resource, which contains the keystore with 
     // your trusted certificates (root and any intermediate certs) 
     final InputStream inputStream = context.getResources().openRawResource(R.raw.parkgroup_ws_client); 
     try { 
      // Initialize the keystore with the provided truste 
      // certificates 
      // Also provide the password of the keystore 
      trusted.load(inputStream, "myKeyStorePassword".toCharArray()); 
     } finally { 
      inputStream.close(); 
     } 
     // Pass the keystore to the SSLSocketFactory. The factory is 
     // responsible 
     // for the verification of the server certificate. 
     final SSLSocketFactory ssf = new SSLSocketFactory(trusted); 
     // Hostname verification from certificate 
     // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 
     ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
     return ssf; 
    } catch (Exception e) { 
     Log.e("MYTAG", e.getMessage()); 
     throw new AssertionError(e); 
    } 
} 

@Override 
protected HttpParams createHttpParams() { 
    final HttpParams httpParams = super.createHttpParams(); 
    httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000); 
    httpParams.setParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false); 
    return httpParams; 
} 

}

Pero siempre muestre el "tiempo de espera de conexión " y no la respuesta nada
Por favor, dime dónde está mi problema? Cualquier ejemplo sería ayuda. ¡Gracias de antemano!

+0

¿Su servidor admite el protocolo TLS? Existe un error conocido en Android que no conecta algunos servidores que no tienen TLS habilitado. –

+0

Sí, lo hace. No sé dónde está mi problema, siempre agota el tiempo – R4j

Respuesta

4

Muchas gracias a Nikolay Elenkov!

Por último, he encontrado la solución. Sigo a este enlace: Using a Custom Certificate Trust Store on Android

En primer lugar, yo uso DefaultHttpClient en lugar de HttpClient (el método createHttpClientWithDefaultSocketFactory() debe ser return DefaultHttpClient):

private DefaultHttpClient createHttpClientWithDefaultSocketFactory(
     KeyStore keyStore, KeyStore trustStore) { 
    try { 
     SSLSocketFactory sslSocketFactory = SSLSocketFactory 
       .getSocketFactory(); 
     if (keyStore != null && trustStore != null) { 
      sslSocketFactory = new SSLSocketFactory(keyStore, 
        KEYSTORE_PASSWORD, trustStore); 
     } else if (trustStore != null) { 
      sslSocketFactory = new SSLSocketFactory(trustStore); 
     } 

     return createHttpClient(sslSocketFactory); 
    } catch (GeneralSecurityException e) { 
     throw new RuntimeException(e); 
    } 
} 

Luego añadir CredentialsProvider para la autenticación.

DefaultHttpClient client = createHttpClientWithDefaultSocketFactory(
       keyStore, trustStore); 
     HttpPost httpPost = new HttpPost(SERVER_AUTH_URL); 
     httpPost.setHeader("Content-type", "text/xml;utf-8"); 

     StringEntity se = new StringEntity(builder.toString(), "UTF8"); 
     se.setContentType("text/xml"); 
     httpPost.setEntity(se); 
     CredentialsProvider credProvider = new BasicCredentialsProvider(); 

     credProvider.setCredentials(new AuthScope(URL, 
       443), new UsernamePasswordCredentials(USERNAME, password)); 

     // This will exclude the NTLM authentication scheme 

     client.setCredentialsProvider(credProvider); 
     HttpResponse response = client.execute(httpPost); 

¡Ahora puede funcionar bien!

Cuestiones relacionadas