Sichere HTTP Post in Android

Ich habe eine ziemlich grundlegende Helfer-Klasse, die ich benutze, um alle meine Http Get / Post Zeug zu tun. Ich verwende HttpGet, HttpPost und HttpClient aus der org.apache.http Bibliothek. Alle meine Sachen funktionieren gut über HTTP, aber sobald ich versucht habe, einen Service zu verbrauchen, der über HTTPS funktioniert, bekomme ich eine ClientProtocolException bei der Ausführung der Anfrage. Die einzige Nachricht in der Ausnahme ist "Der Server konnte nicht mit einer gültigen HTTP-Antwort antworten".

Um zu testen, schickte ich die exakt gleiche Nutzlast aus einem Browser mit einem einfachen HTML-Formular und Fiddler2 mit dem RequestBuilder. Ich habe ungültige und leere Nutzlasten gesendet und sogar alle oben mit und ohne Header gesendet, um zu sehen, ob es etwas Funky über die Art und Weise, wie die Objekte die Anfrage bauten.

  • CamcorderProfile.QUALITY_HIGH Auflösung erzeugt grünes flackerndes Video
  • SyncAdapter Alternativen
  • SQLiteOpenHelper Problem mit voll qualifiziertem DB Pfadnamen
  • Wie zu lösen Gradle Sync fehlgeschlagen Fehler (DefaultMavenFactory)?
  • Wie man eine FQL-Abfrage mit dem neuen Android-SDK sendet
  • Wie bekomme ich HomeAsUpButton Pfeil von ActionBar Sherlock?
  • Alles, was ich in der Prüfung verwendet habe, gibt mir eine gültige 200 Status HTTP Antwort. Der Service gibt mir nur eine Struktur, die den Fehler beschreibt, wenn ich ihm etwas anderes als das, was es erwartet, gibt.

    Gibt es etwas Besonderes, das ich dem HttpPost oder HttpClient Objekt (e) hinzufügen muss, um es zu sagen, dass es HTTPS benutzt? Muss ich explizit sagen, dass es einen anderen Port benutzt?

    BEARBEITEN:

    Ich habe in der Tat die falsche Steckdose für die https-Kommunikation registriert. Hier ist die aktualisierte Methode, die ich verwende, um mein HttpClient-Objekt mit der richtigen Socket-Fabrik zu erstellen, nur für den Fall, dass jemand diese Art von Problem in der Zukunft durchsucht:

    private HttpClient createHttpClient() { HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); HttpProtocolParams.setUseExpectContinue(params, true); SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); return new DefaultHttpClient(conMgr, params); } 

  • SQLite-Abfrage aus mehreren Tabellen mit SQLiteDatabase
  • Android hält Caching meine Intents Extras, wie man eine ausstehende Absicht, die frische Extras hält deklarieren?
  • Kann nicht srcCompat für ImageViews in Android verwenden
  • SetViewView Breite und Höhe programmgesteuert?
  • Unerwartete Statuszeile: ICY 200 OK für URL openStream () Methode?
  • CSS Media Query - Soft-Keyboard bricht CSS Orientierungsregeln - alternative Lösung?
  • 2 Solutions collect form web for “Sichere HTTP Post in Android”

    Ich bin mir nicht sicher, warum Sie HTTPS nicht verarbeiten können. Ich schrieb eine Helfer-Klasse für meine eigenen Anwendungen und ich bin in der Lage, GET / POST zu HTTPS ohne ein Problem. Ich werde den Code hier posten und vielleicht kannst du sehen, ob es Unterschiede zwischen meinem Code und deinem gibt.

     import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.params.ClientPNames; import org.apache.http.client.params.CookiePolicy; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; import org.json.JSONObject; import android.util.Log; public class HttpRequest{ DefaultHttpClient httpClient; HttpContext localContext; private String ret; HttpResponse response = null; HttpPost httpPost = null; HttpGet httpGet = null; public HttpRequest(){ HttpParams myParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(myParams, 10000); HttpConnectionParams.setSoTimeout(myParams, 10000); httpClient = new DefaultHttpClient(myParams); localContext = new BasicHttpContext(); } public void clearCookies() { httpClient.getCookieStore().clear(); } public void abort() { try { if (httpClient != null) { System.out.println("Abort."); httpPost.abort(); } } catch (Exception e) { System.out.println("Your App Name Here" + e); } } public String sendPost(String url, String data) { return sendPost(url, data, null); } public String sendJSONPost(String url, JSONObject data) { return sendPost(url, data.toString(), "application/json"); } public String sendPost(String url, String data, String contentType) { ret = null; httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); httpPost = new HttpPost(url); response = null; StringEntity tmp = null; Log.d("Your App Name Here", "Setting httpPost headers"); httpPost.setHeader("User-Agent", "SET YOUR USER AGENT STRING HERE"); httpPost.setHeader("Accept", "text/html,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); if (contentType != null) { httpPost.setHeader("Content-Type", contentType); } else { httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); } try { tmp = new StringEntity(data,"UTF-8"); } catch (UnsupportedEncodingException e) { Log.e("Your App Name Here", "HttpUtils : UnsupportedEncodingException : "+e); } httpPost.setEntity(tmp); Log.d("Your App Name Here", url + "?" + data); try { response = httpClient.execute(httpPost,localContext); if (response != null) { ret = EntityUtils.toString(response.getEntity()); } } catch (Exception e) { Log.e("Your App Name Here", "HttpUtils: " + e); } Log.d("Your App Name Here", "Returning value:" + ret); return ret; } public String sendGet(String url) { httpGet = new HttpGet(url); try { response = httpClient.execute(httpGet); } catch (Exception e) { Log.e("Your App Name Here", e.getMessage()); } //int status = response.getStatusLine().getStatusCode(); // we assume that the response body contains the error message try { ret = EntityUtils.toString(response.getEntity()); } catch (IOException e) { Log.e("Your App Name Here", e.getMessage()); } return ret; } public InputStream getHttpStream(String urlString) throws IOException { InputStream in = null; int response = -1; URL url = new URL(urlString); URLConnection conn = url.openConnection(); if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection"); try{ HttpURLConnection httpConn = (HttpURLConnection) conn; httpConn.setAllowUserInteraction(false); httpConn.setInstanceFollowRedirects(true); httpConn.setRequestMethod("GET"); httpConn.connect(); response = httpConn.getResponseCode(); if (response == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); } } catch (Exception e) { throw new IOException("Error connecting"); } // end try-catch return in; } } 

    Wie einige der Methoden veraltet sind, sollte es nicht so sein?

      private DefaultHttpClient createHttpClient() { HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 10000); HttpConnectionParams.setSoTimeout(params, 10000); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); HttpProtocolParams.setUseExpectContinue(params, true); SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); schReg.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); ClientConnectionManager conMgr = new PoolingClientConnectionManager(schReg); return new DefaultHttpClient(conMgr, params); } 

    Soll ich etwas anderes ändern, wie HttpVersion?

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.