Android - HTTP GET Request

73,410

Solution 1

Here is edited version of your GetMethodEx class. MySSLSocketFactory allows you to connect any server without checking their certificate. As you know it, this is not safe. I recommend you to add your servers' certificate as trusted to your device.

By the way your servers certificate validity date is expired. Even if you add it as trusted, you may not connect to your server.

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

Solution 2

You have an error here:

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

You are using "https://" twice.

EDIT: I got the code from here

Your code should look like:

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;

I did not test it on my end, but it should work. Note you are using the port 8433 instead of 433, so I changed it in the socketfactory scheme.

Solution 3

Take care, with the new version of API all this code is deprecated !

Here is an example of http get with the new 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 from android website : https://developer.android.com/training/volley/simple.html

Solution 4

HttpClient is deprecated. So new way to do: First, add the two dependencies in build.gradle:

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

Then write this code in ASyncTask in doBackground method.

 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
 }

Note: Don't forget to handle the Exceptions in code .

Share:
73,410
Lyanor Roze
Author by

Lyanor Roze

Updated on July 20, 2020

Comments

  • Lyanor Roze
    Lyanor Roze almost 4 years

    I have developed a HTTP GET Method that clearly works.

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

    Here is a print screen of my emulator when retrieving a response from www.google.com

    SCREEN SHOT OF GOOGLE.COM WORKING

    The following code is my retrieval method to display it on screen.

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

    However, when I try it with my own server.

    "https://server:port/xwtimesheets/ping"

    I have the following screen

    MY SERVER, NOT WORKING

  • Diego Sucaria
    Diego Sucaria over 11 years
    When you do the google.com request you do it without https right? Have you tried doing it to you server without the SSL conection?
  • Lyanor Roze
    Lyanor Roze over 11 years
    I've also tried Facebook and that uses the https protocol. My server does not work without the SSL connection. I do have a class that allows all unsigned certificates, I do know this is unsafe. But im unsure how do i implement this class in my code.
  • Diego Sucaria
    Diego Sucaria over 11 years
    stackoverflow.com/questions/2012497/… There is a good example. Replace yours: HttpClient client = new DefaultHttpClient(); URI website = new URI("ts.xoomworks.com:8443/XoomworksTimesheets/ping"); HttpGet request = new HttpGet(); request.setURI(website); HttpResponse response = client.execute(request); with the first answer code.
  • Lyanor Roze
    Lyanor Roze over 11 years
    I get errors in the code in doing this, can you please add a code source as to how it should be, thanks.
  • Lyanor Roze
    Lyanor Roze over 11 years
    getSocketFactory is not declared
  • Diego Sucaria
    Diego Sucaria over 11 years
    just tested it. I edited the main answer. For the error you get, be sure you are using this: "import org.apache.http.conn.ssl.SSLSocketFactory" instead of the java sslsocketfactoyry one
  • Lyanor Roze
    Lyanor Roze over 11 years
    Thank you, does this have to stay in the Try loop ?
  • Diego Sucaria
    Diego Sucaria over 11 years
    Yes, it has to stay inside there.
  • Lyanor Roze
    Lyanor Roze over 11 years
    Just tested your code and it did not work. Not even google.com worked.
  • Ignacio Alorre
    Ignacio Alorre almost 10 years
    @Akdeniz Hi!, I tried what you recoomend, but I'm getting some errors, I post a question asking about it. Could you maybe tell me what I have done wrong?? stackoverflow.com/questions/23900054/… Thanks