android之网络请求框架OKhttp、原生http请求

===============原生http=====================

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText et;
    private String thtmlStr;
    private TextView tv;
    private ImageView imav;
protected final int REQUESTSUCCESS=0;//常量
protected  final int REQUESTFAILure=1;
    // 在主线程定义一个Handler,用来法消息和处理消息,Looper的作用是监听消息队列,去消息队列取消息;程序一启动就会创建一个主线程,同时就有了一个Looper循环
//   @SuppressLint("HandlerLeak")
//   private Handler  handler = new Handler(){
//        //实现handler的方法,这个方法在主线程执行
//        public void handleMessage (Message msg){
//
//            Log.e("main","main");
//if(msg.what==0) {
    tv.setText((String) msg.obj);//只有主线程才能更新UI,网络请求必须在在子线程
//    imav.setImageBitmap((Bitmap)msg.obj);
//}else if(msg.what==1){
//    Toast.makeText(getApplicationContext(),"服务器正忙",Toast.LENGTH_LONG).show();
//}else{
//    imav.setImageBitmap((Bitmap)msg.obj);
//}
//
//        }
//    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button surebtn = (Button) findViewById(R.id.sureBtn);
        surebtn.setOnClickListener(this);//按钮的点击事件
       Log.e("s","11");
        et = findViewById(R.id.urlText);
tv=findViewById(R.id.showtext);
imav=findViewById(R.id.look);
    }

    //网路请求要加权限
    @Override
    public void onClick(View view) {
       Log.e("v","fff");
        new Thread(new Runnable()
        {
            public void run () {



            try {

//获取缓存的图片
                String path = et.getText().toString().trim();
                File file = new File(getCacheDir(), Base64.encodeToString(path.getBytes(),Base64.DEFAULT));

                if (file.exists() && file.length() > 0) {
Log.e("f","使用缓存");
                    Bitmap cacheMap = BitmapFactory.decodeFile(file.getAbsolutePath());
//                    Message msg = Message.obtain();
//                    msg.obj = cacheMap;
//                    handler.sendMessage(msg);

                } else {
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();//http连接
      //post方式***********************
                    conn.setRequestMethod("POST");
                    conn.setReadTimeout(5000);
                    conn.setRequestProperty("ext/plain, text/html","application/x-www-form-urlencoded");
                    conn.setRequestProperty("Content-Length",path.length()+"");
                    conn.setDoOutput(true);//标记,允许输出
                    conn.getOutputStream().write(path.getBytes());//以流的形式吧数据写给服务器


//get方式****************************

                    URL url = new URL(path);//创建url
                    conn.setRequestMethod("GET");//必须大写,默认是GET
                    conn.setConnectTimeout(15000);//设置超时时间
                    int code = conn.getResponseCode();//获取状态码
                    if (code == 200) {//请求成功
                        InputStream in = conn.getInputStream();//获取服务器返回的数据。流的处理抽取成一个工具类Utils
//                    thtmlStr = StreamTools.reamStream(in);

//                    Message msg = new Message();
//                    msg.what=REQUESTSUCCESS;
//                    msg.obj = thtmlStr;
//                    Log.e("msg", (String) msg.obj);
//                    handler.sendMessage(msg);//发送消息,在主线程handler中接收

                        //****************缓存图片************


                        FileOutputStream fos = new FileOutputStream(file);
                        int len = -1;
                        byte[] buffer = new byte[1024];
                        while ((len = in.read(buffer)) != -1) {
                            fos.write(buffer, 0, len);
                        }
                        fos.close();
                        in.close();
 //**************handler发消息更新UI**************************
//                        Message msg = Message.obtain();
//                        msg.what = REQUESTSUCCESS;
//                        Bitmap bm = BitmapFactory.decodeStream(in);//吧流转换成位图;,如果in没有关闭流使用这个方法
                     final   Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
//                        msg.obj = bm;
//                        handler.sendMessage(msg);

                        //***************runOnUiThread更新UI****************如果只是更新ui,则使用runOnUiThread,如果要携带数据,就用handler;
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //不管在主线程还是子线程都会执行
                                imav.setImageBitmap(bm);
                            }
                        });

                    } else {

//                        Message msg = new Message();
//                        msg.what = REQUESTFAILure;
//                        handler.sendMessage(msg);//发送消息,在主线程handler中接收
                    }
                }

                } catch(MalformedURLException e){
                    e.printStackTrace();
                } catch(IOException e){
                    e.printStackTrace();
                }

        }}) .start();

    }


}

----------读取stream流的工具类---------

/**
 * Created by wofu on 2018/3/27.
 * stream的工具类
 */

public class StreamTools extends Object {

//吧inputstream转换成String
    public static String reamStream (InputStream in) throws IOException {
//定义一个内存输出流
        ByteArrayOutputStream out=new ByteArrayOutputStream();
        int len=-1;
        byte[] buffer= new byte[1024];

if((len=in.read(buffer))!=-1){
    out.write(buffer,0,len);//
}
String content=new String(out.toByteArray());
        return content;
    }

}


============Volley=============

=============Retrofit==========

========OkHttp===========

OKHttp  Github地址:----https://github.com/square/okhttp

导入okhttp中遇到的问题:1,可能重复导入---解决:在file-》project Structure-->app-->dependencies;吧okhttp删掉;


okhttp使用:https://blog.csdn.net/fightingXia/article/details/70947701

https://blog.csdn.net/s13383754499/article/details/78978025

https://www.jianshu.com/p/f5320b1e0287

问题:response.body().string()只能调用一次分析

使用:

在清单文件中添加权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

在app模块中的build. graidle 中

dependencies {
   
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
}
*********OKHttp中设置请求头特别简单,在创建request对象时调用一个方法即可。
Request request = new Request.Builder().url("http://www.baidu.com").header("User-Agent", "OkHttp Headers.java").addHeader("token", "myToken").build();

1.同步:get

//get同步请求---http://ddb.cn/api/VlianbaoCash/deposit
    public void gettongbuDatasync(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
                Request request = new Request.Builder()
                        .url(String.valueOf(test.getText()))//请求接口。如果需要传参拼接到接口后面。
                        .build();//创建Request 对象
                Response response = null;
                try {
                    response = client.newCall(request).execute();//得到Response 对象
                    Log.e("kwwl","get同步res=="+response.body().string());

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


//get异步请求
private void getyibuDataAsync() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(String.valueOf(test.getText()))
                    .build();//创建request对象
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    //请求失败的回调

                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
                    if (response.isSuccessful()) {//回调的方法执行在子线程。
                        Log.d("kwwl", "get异步获取数据成功了");
                        Log.d("kwwl", "get异步response.code()==" + response.code());
                        Log.d("kwwl", "get异步response.body().string()==" + response.body().string());

                    }
                }
            });
        }
        }).start();
}


//post同步




    //post异步

    private void postyibuDataWithParame() {
        new Thread(new Runnable() {
            @Override
            public void run() {
        OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("username","zhangsan");//传递键值对参数
        Request request = new Request.Builder()//创建Request 对象。
                .url(String.valueOf(test.getText()))
                .post(formBody.build())//传递请求体
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
                if(response.isSuccessful()){//回调的方法执行在子线程。
                    Log.d("kwwl","post异步获取数据成功了");
                    Log.d("kwwl","post异步response.code()=="+response.code());
                    Log.d("kwwl","post异步response.body().string()=="+response.body().string());

                }
            }
        });
    }
        }).start();
        }



//    使用FormBody传递键值对参数,用来上传String类型的键值对 ,post方法接收的参数是RequestBody 对象,所以只要是RequestBody 类以及子类对象都可以当作参数进行传递。FormBody就是RequestBody 的一个子类对象。
private void postyibuFormBodyDataWithParame() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
            FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
            formBody.add("username","zhangsan");//传递键值对参数
            Request request = new Request.Builder()//创建Request 对象。
                    .url("http://www.baidu.com")
                    .post(formBody.build())//传递请求体
                    .build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
                    if(response.isSuccessful()){//回调的方法执行在子线程。
                        Log.d("kwwl","post异步获取数据成功了");
                        Log.d("kwwl","post异步response.code()=="+response.code());
                        Log.d("kwwl","post异步response.body().string()=="+response.body().string());
                    }
                }
            });
        }

        }).start();
}


    //    使用RequestBody传递Json,RequestBody是抽象类,故不能直接使用,但是他有静态方法create,使用这个方法可以得到RequestBody对象。这种方式可以上传Json对象或File对象。
    private void postyibuFileDataWithParame() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
                MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
                String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据.
                RequestBody body = RequestBody.create(JSON, jsonStr);
                Request request = new Request.Builder()
                        .url("http://www.baidu.com")
                        .post(body)
                        .build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
                        if(response.isSuccessful()){//回调的方法执行在子线程。
                            Log.d("kwwl","post异步获取数据成功了");
                            Log.d("kwwl","post异步response.code()=="+response.code());
                            Log.d("kwwl","post异步response.body().string()=="+response.body().string());
                        }
                    }
                });
            }
        }).start();
    }


    //    使用RequestBody传递File对象,
    private void postyibuJsonDataWithParame() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
                MediaType fileType = MediaType.parse("File/*");//数据类型为json格式,
                File file = new File("path");//file对象.
                RequestBody body = RequestBody.create(fileType , file );
                Request request = new Request.Builder()
                        .url("http://www.baidu.com")
                        .post(body)
                        .build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
                        if(response.isSuccessful()){//回调的方法执行在子线程。
                            Log.d("kwwl","post异步获取数据成功了");
                            Log.d("kwwl","post异步response.code()=="+response.code());
                            Log.d("kwwl","post异步response.body().string()=="+response.body().string());
                        }
                    }
                });
            }
        }).start();
    }

    //   使用MultipartBody同时传递键值对参数和File对象,FromBody传递的是字符串型的键值对,RequestBody传递的是多媒体,那么如果我们想二者都传递怎么办?此时就需要使用MultipartBody类。
    private void postyibuFileAndJsonDataWithParame() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();
                File file=new File("路径名");
                MultipartBody multipartBody =new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addFormDataPart("groupId","idone")//添加键值对参数
                        .addFormDataPart("title","title")
                        .addFormDataPart("file","文件名",RequestBody.create(MediaType.parse("file/*"), file))//添加文件
                        .build();
                final Request request = new Request.Builder()
                        .url("http://")
                        .post(multipartBody)
                        .build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
                        if(response.isSuccessful()){//回调的方法执行在子线程。
                            Log.d("kwwl","post异步获取数据成功了");
                            Log.d("kwwl","post异步response.code()=="+response.code());
                            Log.d("kwwl","post异步response.body().string()=="+response.body().string());
                        }
                    }
                });
            }
        }).start();
    }




    //自定义RequestBody实现流的上传,只要是RequestBody类以及子类都可以作为post方法的参数,下面我们就自定义一个类,继承RequestBody,实现流的上传。
    private void postyibuAudefineRequestBodyDataWithParame() {

        RequestBody body = new RequestBody() {
            @Override
            public MediaType contentType() {
                return null;
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {//重写writeTo方法
                FileInputStream fio= new FileInputStream(new File("fileName"));
                byte[] buffer = new byte[1024*8];
                if(fio.read(buffer) != -1){
                    sink.write(buffer);
                }
            }
        };

        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
                Request request = new Request.Builder()
                        .url("http://www.baidu.com")
                        .post(body)
                        .build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
//请求成功的回调
                        if(response.isSuccessful()){//回调的方法执行在子线程。
                            Log.d("kwwl","post异步获取数据成功了");
                            Log.d("kwwl","post异步response.code()=="+response.code());
                            Log.d("kwwl","post异步response.body().string()=="+response.body().string());
                        }
                    }
                });
            }
        }).start();
    }


//    //下载, 在OKHttp中并没有提供下载文件的功能,但是在Response中可以获取流对象,有了流对象我们就可以自己实现文件的下载。代码如下:这段代码写在回调接口CallBack的onResponse方法中:
//    public void download() {
//
//
//                try {
//                    InputStream is = response.body().byteStream();//从服务器得到输入流对象
//                    long sum = 0;
//                    File dir = new File(mDestFileDir);
//                    if (!dir.exists()) {
//                        dir.mkdirs();
//                    }
//                    File file = new File(dir, mdestFileName);//根据目录和文件名得到file对象
//                    FileOutputStream fos = new FileOutputStream(file);
//                    byte[] buf = new byte[1024 * 8];
//                    int len = 0;
//                    while ((len = is.read(buf)) != -1) {
//                        fos.write(buf, 0, len);
//                    }
//                    fos.flush();
//
//                }
//    }

=======afinal中的FinalHttp===========


OKHttp中设置请求头特别简单,在创建request对象时调用一个方法即可。

Request request = new Request.Builder() .url("http://www.baidu.com") .header("User-Agent", "OkHttp Headers.java") .addHeader("token", "myToken") .build();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值