Android - HTTP GET Request

后端 未结 4 2101
迷失自我
迷失自我 2020-12-29 12:30

I have developed a HTTP GET Method that clearly works.

public class GetMethodEx {


public String getInternetData() throws Exception{

        new TrustAllMa         


        
相关标签:
4条回答
  • 2020-12-29 13:05

    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 .

    0 讨论(0)
  • 2020-12-29 13:13

    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();
        }
    }
    }
    
    0 讨论(0)
  • 2020-12-29 13:17

    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

    0 讨论(0)
  • 2020-12-29 13:18

    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.

    0 讨论(0)
提交回复
热议问题