Android – requête HTTP GET

J'ai développé une méthode HTTP GET qui fonctionne clairement.

public class GetMethodEx { public String getInternetData() throws Exception{ new TrustAllManager(); new TrustAllSSLSocketFactory(); BufferedReader in = null; String data = null; try { HttpClient client = new DefaultHttpClient(); URI website = new URI("https://server.com:8443/Timesheets/ping"); HttpGet request = new HttpGet(); request.setURI(website); HttpResponse response = client.execute(request); response.getStatusLine().getStatusCode(); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String l = ""; String nl = System.getProperty("line.separator"); while ((l = in.readLine()) !=null){ sb.append(l + nl); } in.close(); data = sb.toString(); return data; } finally{ if (in != null){ try{ in.close(); return data; }catch (Exception e){ e.printStackTrace(); } } } } 

Voici un écran d'impression de mon émulateur lors de la récupération d'une réponse à partir de www.google.com

  • Envoi de fichiers via POST avec HttpURLConnection
  • Dupliquer les fichiers pendant l'emballage de APK app-debug-unaligned.apk
  • Android- POST multipart form data
  • Comment les utilisateurs / développeurs peuvent-ils définir la configuration proxy Android pour les versions 2.x?
  • Puis-je exécuter un serveur HTTP sur une plate-forme mobile?
  • Comment faire un post HTTP dans Android?
  • SCREEN SHOT DE GOOGLE.COM TRAVAIL

    Le code suivant est ma méthode de récupération pour l'afficher à l'écran.

     public class Home extends Activity { TextView httpStuff; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.httpexample); httpStuff = (TextView) findViewById(R.id.tvhttp); new LongOperation().execute(""); } private class LongOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { GetMethodEx test = new GetMethodEx(); String returned = null; try { returned = test.getInternetData(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return returned; } @Override protected void onPostExecute(String result) { httpStuff.setText(result); } 

    Cependant, lorsque j'essaie avec mon propre serveur.

    " Https: // serveur: port / xwtimesheets / ping "

    J'ai l'écran suivant

    MY SERVER, PAS TRAVAILLER

  • Les demandes HTTP Post utilisant HttpClient prennent 2 secondes, pourquoi?
  • Passer les données JSON dans la demande comme organisme de demande
  • Erreur d'authentification lors de l'utilisation de HttpPost avec DefaultHttpClient sur Android
  • Pourquoi notre serveur reçoit des demandes de méthode CONNECT de notre application Android alors que nous ne l'utilisons pas dans notre code?
  • Android - Envoi de HTTPS Demande d'achat
  • Erreur Android: MultipartEntity, la demande envoyée par le client était syntaxiquement incorrecte
  • 4 Solutions collect form web for “Android – requête HTTP GET”

    Voici la version modifiée de votre classe GetMethodEx. MySSLSocketFactory vous permet de connecter un serveur sans vérifier son certificat. Comme vous le savez, ce n'est pas sûr. Je vous recommande d'ajouter le certificat de vos serveurs comme étant confié à votre appareil.

    En passant, la date de validité du certificat de votre serveur est expirée. Même si vous l'ajoutez en tant que confiance, vous ne pouvez pas vous connecter à votre serveur.

     public class GetMethodEx { public String getInternetData() throws Exception { BufferedReader in = null; String data = null; try { HttpClient client = new DefaultHttpClient(); client.getConnectionManager().getSchemeRegistry().register(getMockedScheme()); URI website = new URI("https://server.com:8443/XoW"); HttpGet request = new HttpGet(); request.setURI(website); HttpResponse response = client.execute(request); response.getStatusLine().getStatusCode(); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String l = ""; String nl = System.getProperty("line.separator"); while ((l = in.readLine()) != null) { sb.append(l + nl); } in.close(); data = sb.toString(); return data; } finally { if (in != null) { try { in.close(); return data; } catch (Exception e) { Log.e("GetMethodEx", e.getMessage()); } } } } public Scheme getMockedScheme() throws Exception { MySSLSocketFactory mySSLSocketFactory = new MySSLSocketFactory(); return new Scheme("https", mySSLSocketFactory, 443); } class MySSLSocketFactory extends SSLSocketFactory { javax.net.ssl.SSLSocketFactory socketFactory = null; public MySSLSocketFactory(KeyStore truststore) throws Exception { super(truststore); socketFactory = getSSLSocketFactory(); } public MySSLSocketFactory() throws Exception { this(null); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return socketFactory.createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return socketFactory.createSocket(); } javax.net.ssl.SSLSocketFactory getSSLSocketFactory() throws Exception { SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; sslContext.init(null, new TrustManager[] { tm }, null); return sslContext.getSocketFactory(); } } } 

    Vous avez une erreur ici:

     URI website = new URI("https://https://ts.xoomworks.com:8443/XoomworksTimesheets/ping"); 

    Vous utilisez deux fois "https: //".

    EDIT: J'ai reçu le code ici

    Votre code devrait ressembler à:

     HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; DefaultHttpClient client = new DefaultHttpClient(); SchemeRegistry registry = new SchemeRegistry(); SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); registry.register(new Scheme("https", socketFactory, 8443)); SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry); DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams()); // Set verifier HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); // Example send http request final String url = "https://ts.xoomworks.com:8443/XoomworksTimesheets/ping/"; HttpPost httpPost = new HttpPost(url); HttpResponse response = httpClient.execute(httpPost); response.getStatusLine().getStatusCode(); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String l = ""; String nl = System.getProperty("line.separator"); while ((l = in.readLine()) !=null){ sb.append(l + nl); } in.close(); data = sb.toString(); return data; 

    Je ne l'ai pas testé à ma fin, mais cela devrait fonctionner. Notez que vous utilisez le port 8433 au lieu de 433, donc je l'ai changé dans le schéma socketfactory.

    Attention, avec la nouvelle version de l'API, tout ce code est obsolète !

    Voici un exemple de http avec les nouveaux api .

     RequestQueue queue = Volley.newRequestQueue(this); String url ="http://www.google.com"; // Request a string response from the provided URL. StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // Display the first 500 characters of the response string. mTextView.setText("Response is: "+ response.substring(0,500)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { mTextView.setText("That didn't work!"); } }); // Add the request to the RequestQueue. queue.add(stringRequest); 

    Source du site Web Android: https://developer.android.com/training/volley/simple.html

    HttpClient est obsolète. Donc une nouvelle façon de faire: d'abord, ajoutez les deux dépendances dans build.gradle:

     compile 'org.apache.httpcomponents:httpcore:4.4.1' compile 'org.apache.httpcomponents:httpclient:4.5' 

    Ensuite, écrivez ce code dans ASyncTask dans la méthode doBackground .

      URL url = new URL("http://localhost:8080/web/get?key=value"); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setRequestMethod("GET"); int statusCode = urlConnection.getResponseCode(); if (statusCode == 200) { InputStream it = new BufferedInputStream(urlConnection.getInputStream()); InputStreamReader read = new InputStreamReader(it); BufferedReader buff = new BufferedReader(read); StringBuilder dta = new StringBuilder(); String chunks ; while((chunks = buff.readLine()) != null) { dta.append(chunks); } } else { //Handle else } 

    Remarque : N'oubliez pas de gérer les exceptions dans le code.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.