Zamów usługi Exchange Web Services 2007/2010 z SOAP + XML przez HTTPS w Androidzie
Użyłem następującego kodu C # firmy Microsoft do żądania EWS 2010Link MSDN i to zadziałało. Potrzebuję tego samego rozwiązania dla Androida.
Próbowałem użyć następującego kodu, ale to nie pomaga
<code> 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()); </code>
Oto moje żądanie XML
<code><?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> </code>
Używam również niestandardowego HttpsClient z magazynem kluczy.
<code>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; } </code>
}
Ale to zawsze pokazuje ”limit czasu połączenia„i nic nie odpowiada
Proszę mi powiedzieć, gdzie jest mój problem? Każdy przykład byłby pomocny. Z góry dziękuję!