zoukankan      html  css  js  c++  java
  • Android http 的使用

    1、okHttp

           https://github.com/square/okhttp

    2、okhttp-utils

          https://github.com/hongyangAndroid/okhttp-utils

    3、NoHttp

          https://github.com/yanzhenjie/NoHttp

    4、okhttp-OkGo

         https://github.com/jeasonlzy/okhttp-OkGo

    5、最原生的http

    package www.yiba.com.wifisdk.http;
    
    import android.os.Build;
    
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLConnection;
    
    import javax.net.ssl.HttpsURLConnection;
    
    public class HttpUtil {
    
        private static final int TIMEOUT_IN_MILLIONS = 25000;
    
        /**
         * Get请求,获得返回数据
         * @param urlStr
         * @return
         * @throws Exception
         */
        public static String doGet(String urlStr , Callback callback) {
            URL url = null;
            URLConnection conn = null;
            InputStream is = null;
            ByteArrayOutputStream baos = null;
            try {
                url = new URL(urlStr);
                int responseCode = -1;
                if (urlStr.toLowerCase().startsWith("https")) {
                    conn = url.openConnection();
                    ((HttpsURLConnection) conn).setRequestMethod("GET");
                    conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setRequestProperty("accept", "*/*");
                    conn.setRequestProperty("connection", "Keep-Alive");
                    if (Build.VERSION.SDK != null
                            && Build.VERSION.SDK_INT > 13) {//http://www.tuicool.com/articles/7FrMVf
                        conn.setRequestProperty("Connection", "close");
                    }
                    responseCode = ((HttpsURLConnection) conn).getResponseCode();
                } else {
                    conn = url.openConnection();
                    ((HttpURLConnection) conn).setRequestMethod("GET");
                    conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setRequestProperty("accept", "*/*");
                    conn.setRequestProperty("connection", "Keep-Alive");
                    if (Build.VERSION.SDK != null
                            && Build.VERSION.SDK_INT > 13) {//http://www.tuicool.com/articles/7FrMVf
                        conn.setRequestProperty("Connection", "close");
                    }
                    responseCode = ((HttpURLConnection) conn).getResponseCode();
                }
                if (responseCode == 200) {
                    is = conn.getInputStream();
                    baos = new ByteArrayOutputStream();
                    int len = -1;
                    byte[] buf = new byte[128];
    
                    while ((len = is.read(buf)) != -1) {
                        baos.write(buf, 0, len);
                    }
                    baos.flush();
                    if ( callback != null ){
                        callback.ok( baos.toString() );
                    }
                    return baos.toString();
                } else {
                    if ( callback != null ){
                        callback.fail();
                    }
                    throw new RuntimeException(" responseCode is not 200 ... ");
                }
    
            } catch (Exception e) {
                if ( callback != null ){
                    callback.timeOut();
                }
                e.printStackTrace();
            } finally {
                try {
                    if (is != null)
                        is.close();
                } catch (IOException e) {
                }
                try {
                    if (baos != null)
                        baos.close();
                } catch (IOException e) {
                }
                if (conn != null) {
                    if (urlStr.toLowerCase().startsWith("https")) {
                        ((HttpsURLConnection) conn).disconnect();
                    } else {
                        ((HttpURLConnection) conn).disconnect();
                    }
                }
            }
            return null;
        }
    
    
        public static String doPost(String url, String param , Callback callback ) {
            PrintWriter out = null;
            BufferedReader in = null;
            String result = "";
            URLConnection conn = null;
            try {
                URL realUrl = new URL(url);
                //打开和URL之间的连接
                conn =  realUrl.openConnection();
                //设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type",
                        "application/x-www-form-urlencoded");
                if (url.toLowerCase().startsWith("https")) {
                    ((HttpsURLConnection) conn).setRequestMethod("POST");
                } else {
                    ((HttpURLConnection) conn).setRequestMethod("POST");
                }
                conn.setRequestProperty("charset", "utf-8");
                conn.setUseCaches(false);
                //发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
                conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
    
                if (param != null && !param.trim().equals("")) {
                    // 获取URLConnection对象对应的输出流
                    out = new PrintWriter(conn.getOutputStream());
                    // 发送请求参数
                    out.print(param);
                    // flush输出流的缓冲
                    out.flush();
                }
    
                int responseCode = ((HttpURLConnection) conn).getResponseCode();
                if ( responseCode == 200 ){
                    // 定义BufferedReader输入流来读取URL的响应
                    in = new BufferedReader(
                            new InputStreamReader(conn.getInputStream()));
                    String line;
                    while ((line = in.readLine()) != null) {
                        result += line;
                    }
    
                    if ( callback != null ){
                        callback.ok( result );
                    }
                }else {
                    if ( callback != null ){
                        callback.fail();
                    }
                }
            } catch (Exception e) {
                if ( callback != null ){
                    callback.timeOut();
                }
                e.printStackTrace();
            }
            finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                if (conn != null) {
                    if (url.toLowerCase().startsWith("https")) {
                        ((HttpsURLConnection) conn).disconnect();
                    } else {
                        ((HttpURLConnection) conn).disconnect();
                    }
                }
            }
            return result;
        }
    
        public interface Callback{
            void ok( String result ) ;
            void fail();
            void timeOut() ;
        }
    
    }
    

    6、对原生http的简易封装

          6.1 HttpCall http 请求结果的实体类

          

    package www.yiba.com.analytics.http;
    
    /**
     * Created by ${zyj} on 2016/8/18.
     */
    public class HttpCall {
    
        private ResponseType httpQuestType  ;
        private String result ;
    
        public ResponseType getHttpQuestType() {
            return httpQuestType;
        }
    
        public void setHttpQuestType(ResponseType httpQuestType) {
            this.httpQuestType = httpQuestType;
        }
    
        public String getResult() {
            return result;
        }
    
        public void setResult(String result) {
            this.result = result;
        }
    }
    

      

          6.2 ResponseType http 请求结果的类型

    package www.yiba.com.analytics.http;
    
    /**
     * Created by ${zyj} on 2016/8/18.
     */
    public enum ResponseType {
    
        OK("请求成功") , FAIL("请求失败") , TIMEOUT("请求超时") ;
    
        private String name ;
    
        private ResponseType(String name ){
            this.name = name ;
        }
    
        public String getName() {
            return name;
        }
    }
    

      

          6.3 HttpUtil 包含 get 和 post请求

    package www.yiba.com.analytics.http;
    
    import android.os.Build;
    
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLConnection;
    
    import javax.net.ssl.HttpsURLConnection;
    
    public class HttpUtil {
    
        private static final int TIMEOUT_IN_MILLIONS = 25000;
    
        /**
         * Get请求,获得返回数据
         * @param urlStr
         * @return
         * @throws Exception
         */
        public static HttpCall doGet(String urlStr , Callback callback) {
            URL url = null;
            URLConnection conn = null;
            InputStream is = null;
            ByteArrayOutputStream baos = null;
            HttpCall httpCall = new HttpCall() ;
    
            try {
                url = new URL(urlStr);
                int responseCode = -1;
                if (urlStr.toLowerCase().startsWith("https")) {
                    conn = url.openConnection();
                    ((HttpsURLConnection) conn).setRequestMethod("GET");
                    conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setRequestProperty("accept", "*/*");
                    conn.setRequestProperty("connection", "Keep-Alive");
                    if (Build.VERSION.SDK != null
                            && Build.VERSION.SDK_INT > 13) {//http://www.tuicool.com/articles/7FrMVf
                        conn.setRequestProperty("Connection", "close");
                    }
                    responseCode = ((HttpsURLConnection) conn).getResponseCode();
                } else {
                    conn = url.openConnection();
                    ((HttpURLConnection) conn).setRequestMethod("GET");
                    conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
                    conn.setRequestProperty("accept", "*/*");
                    conn.setRequestProperty("connection", "Keep-Alive");
                    if (Build.VERSION.SDK != null
                            && Build.VERSION.SDK_INT > 13) {//http://www.tuicool.com/articles/7FrMVf
                        conn.setRequestProperty("Connection", "close");
                    }
                    responseCode = ((HttpURLConnection) conn).getResponseCode();
                }
                if (responseCode == 200) {
                    is = conn.getInputStream();
                    baos = new ByteArrayOutputStream();
                    int len = -1;
                    byte[] buf = new byte[128];
    
                    while ((len = is.read(buf)) != -1) {
                        baos.write(buf, 0, len);
                    }
                    baos.flush();
                    if ( callback != null ){
                        callback.ok( baos.toString() );
                    }
                    if ( httpCall != null ){
                        httpCall.setHttpQuestType( ResponseType.OK  );
                        httpCall.setResult( baos.toString() );
                    }
    
                } else {
                    if ( callback != null ){
                        callback.fail();
                    }
                    if ( httpCall != null ){
                        httpCall.setHttpQuestType( ResponseType.FAIL  );
                        httpCall.setResult( "" );
                    }
                }
    
            } catch (Exception e) {
                if ( callback != null ){
                    callback.timeOut();
                }
                if ( httpCall != null ){
                    httpCall.setHttpQuestType( ResponseType.TIMEOUT  );
                    httpCall.setResult( "" );
                }
                e.printStackTrace();
            } finally {
                try {
                    if (is != null)
                        is.close();
                } catch (IOException e) {
                }
                try {
                    if (baos != null)
                        baos.close();
                } catch (IOException e) {
                }
                if (conn != null) {
                    if (urlStr.toLowerCase().startsWith("https")) {
                        ((HttpsURLConnection) conn).disconnect();
                    } else {
                        ((HttpURLConnection) conn).disconnect();
                    }
                }
    
                return httpCall ;
            }
        }
    
    
        public static HttpCall doPost(String url, String param , Callback callback ) {
            PrintWriter out = null;
            BufferedReader in = null;
            String result = "";
            URLConnection conn = null;
            HttpCall httpCall = new HttpCall() ;
    
            try {
                URL realUrl = new URL(url);
                //打开和URL之间的连接
                conn =  realUrl.openConnection();
                //设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type",
                        "application/json");
                if (url.toLowerCase().startsWith("https")) {
                    ((HttpsURLConnection) conn).setRequestMethod("POST");
                } else {
                    ((HttpURLConnection) conn).setRequestMethod("POST");
                }
                conn.setRequestProperty("charset", "utf-8");
                conn.setUseCaches(false);
                //发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
                conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
    
                if (param != null && !param.trim().equals("")) {
                    // 获取URLConnection对象对应的输出流
                    out = new PrintWriter(conn.getOutputStream());
                    // 发送请求参数
                    out.print(param);
                    // flush输出流的缓冲
                    out.flush();
                }
    
                int responseCode = ((HttpURLConnection) conn).getResponseCode();
                if ( responseCode == 200 ){
                    // 定义BufferedReader输入流来读取URL的响应
                    in = new BufferedReader(
                            new InputStreamReader(conn.getInputStream()));
                    String line;
                    while ((line = in.readLine()) != null) {
                        result += line;
                    }
    
                    if ( callback != null ){
                        callback.ok( result );
                    }
    
                    if ( httpCall != null ){
                        httpCall.setHttpQuestType( ResponseType.OK  );
                        httpCall.setResult( result );
                    }
    
                }else {
                    if ( callback != null ){
                        callback.fail();
                    }
                    if ( httpCall != null ){
                        httpCall.setHttpQuestType( ResponseType.FAIL  );
                        httpCall.setResult( "" );
                    }
    
                }
            } catch (Exception e) {
                if ( callback != null ){
                    callback.timeOut();
                }
                if ( httpCall != null ){
                    httpCall.setHttpQuestType( ResponseType.TIMEOUT  );
                    httpCall.setResult( "" );
                }
                e.printStackTrace();
            }
            finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                if (conn != null) {
                    if (url.toLowerCase().startsWith("https")) {
                        ((HttpsURLConnection) conn).disconnect();
                    } else {
                        ((HttpURLConnection) conn).disconnect();
                    }
                }
                return httpCall ;
            }
        }
    
        public interface Callback{
            void ok(String result) ;
            void fail();
            void timeOut() ;
        }
    
    }
    

      

          6.4 如何使用

    private void httpGet(){
    
            //get 用法1
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpUtil.doGet("http://www.baidu.com",  new HttpUtil.Callback() {
                        @Override
                        public void ok(String result) {
                            //请求成功
                        }
    
                        @Override
                        public void fail() {
                            //请求失败
                        }
    
                        @Override
                        public void timeOut() {
                            //请求超时
                        }
                    }) ;
                }
            }) ;
    
            //get 用法2
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpCall httpCall = HttpUtil.doGet( "http://www.baidu.com"  , null ) ;
                    switch ( httpCall.getHttpQuestType() ){
                        case OK:
                            //请求成功
                            break;
                        case FAIL:
                            //请求失败
                            break;
                        case TIMEOUT:
                            //请求超时
                            break;
                    }
                }
            }) ;
        }
    
    
        private void httpPost(){
    
            //post 用法1
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpUtil.doPost("http://www.baidu.com", "post请求参数" , new HttpUtil.Callback() {
                        @Override
                        public void ok(String result) {
                            //请求成功
                        }
    
                        @Override
                        public void fail() {
                            //请求失败
                        }
    
                        @Override
                        public void timeOut() {
                            //请求超时
                        }
                    }) ;
                }
            }) ;
    
            //post 用法2
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpCall httpCall = HttpUtil.doPost( "http://www.baidu.com" , "post请求参数" , null ) ;
                    switch ( httpCall.getHttpQuestType() ){
                        case OK:
                            //请求成功
                            break;
                        case FAIL:
                            //请求失败
                            break;
                        case TIMEOUT:
                            //请求超时
                            break;
                    }
                }
            }) ;
        }
    

      

    7、http下载图片并且压缩bitmap  

    //从网络下载bitmap
        private Bitmap downLoadBitmapFromNet( String urlString ){
            InputStream inputStream = null ;
            HttpURLConnection conn = null  ;
            Bitmap bitmap ;
            try {
                URL url = new URL( urlString ) ;
                conn = (HttpURLConnection) url.openConnection();
                inputStream = new BufferedInputStream( conn.getInputStream() ) ;
    
                inputStream.mark( inputStream.available() );
    
                //压缩图片
                BitmapFactory.Options options = new BitmapFactory.Options() ;
                options.inJustDecodeBounds = true ;
                BitmapFactory.decodeStream( inputStream , null , options ) ;
                options.inSampleSize = 4 ;
                options.inPreferredConfig = Bitmap.Config.RGB_565 ;
                options.inJustDecodeBounds = false ;
    
                inputStream.reset();
                bitmap = BitmapFactory.decodeStream( inputStream , null , options ) ;
    
                return  bitmap ;
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }catch (IOException e) {
                e.printStackTrace();
            }finally {
                if ( inputStream != null ){
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if ( conn != null  ){
                    conn.disconnect();
                }
            }
            return  null ;
        }
    

      需要注意的事项

    1、并不是所有的inputStream都支持mark()方法的, 因为这里的 InputStream其实是 BufferedInputStream 。 BufferedInputStream 继承 InputStream 并且重写了里面的 mark() 、reset() 、markSupported()

  • 相关阅读:
    模块三
    python的6种基本数据类型--字典
    python的6种基本数据类型--集合
    数据集之集合
    锚点使用
    JSON返回DateTime/Date('123123123')/解决办法
    JSON返回DateTime/Date('123123123')/解决办法
    设计模式-系列索引
    设计模式-系列索引
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/zhaoyanjun/p/5276345.html
Copyright © 2011-2022 走看看