Android – Solicitud HTTP GET

He desarrollado un método HTTP GET que funciona claramente.

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(); } } } } 

Esta es una pantalla de impresión de mi emulador cuando recupera una respuesta de www.google.com

TIRO DE PANTALLA DE GOOGLE.COM TRABAJO

El siguiente código es mi método de recuperación para mostrarlo en la pantalla.

 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); } 

Sin embargo, cuando lo intento con mi propio servidor.

" Https: // server: port / xwtimesheets / ping "

Tengo la siguiente pantalla

MI SERVIDOR NO TRABAJA

4 Solutions collect form web for “Android – Solicitud HTTP GET”

Aquí está la versión editada de su clase GetMethodEx. MySSLSocketFactory le permite conectar cualquier servidor sin comprobar su certificado. Como usted lo sabe, esto no es seguro. Le recomiendo que agregue el certificado de sus servidores como confiable a su dispositivo.

Por cierto, la fecha de validez de su certificado de servidores caducó. Incluso si lo agrega como de confianza, es posible que no se conecte a su servidor.

 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(); } } } 

Tiene un error aquí:

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

Está utilizando "https: //" dos veces.

EDIT: Tengo el código de aquí

Tu código debería ser como:

 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; 

No lo probé en mi final, pero debería funcionar. Tenga en cuenta que está utilizando el puerto 8433 en lugar de 433, por lo que lo cambié en el esquema socketfactory.

Tenga cuidado, con la nueva versión de la API todo este código está obsoleto !

Aquí hay un ejemplo de http con la nueva 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); 

Fuente del sitio web de Android: https://developer.android.com/training/volley/simple.html

HttpClient está obsoleto. Así que nueva manera de hacer: Primero, agregue las dos dependencias en build.gradle:

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

A continuación, escriba este código en ASyncTask en el método 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 } 

Nota : No olvide manejar las Excepciones en el código.

  • Parámetros de Android HTTP GET
  • Obtener el tamaño de Bitmap Android
  • ¿Cómo devolver el índice del niño en Layout?
  • Cómo llamar al método GET simple usando "Retrofit"
  • Cadena de escape de EditText
  • Límite de longitud en los parámetros JSON en la solicitud GET
  • ¿Cómo obtener el último registro de Sqlite?
  • Cómo obtener la ruta completa del archivo desde URI
  • ¿Cómo obtengo el nombre de todas las categorías de la aplicación Android?
  • Obtener texto de un EditText
  • Android HttpUrlConnection hace POST en lugar de GET
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.