OkHttp连接后台
OkHttp介绍及基本配置
OkHttp是一个优秀的网络请求框架,主要介绍介绍OkHttp的Get请求、Post请求、上传下载文件、 上传下载图片等功能。
1、进行依赖配置和xml中加入联网权限
在对应的Module的gradle中添加 compile 'com.squareup.okhttp3:okhttp:3.5.0' 然后同步一下项目即可 同时需要在AndroidMainffest.xml中加入联网的权限 <uses-permission android:name="android.permission.INTERNET" />
进行Get请求
1、拿到OkHttpClient对象
- OkHttpClient client = new OkHttpClient();
2、构造Request对象
Request request = new Request.Builder() .get() .url("https:www.baidu.com") .build(); 如果我们需要在get请求时传递参数,我们可以以下面的方式将参数拼接在url之后 https:www.baidu.com?username=admin&password=admin
3、将Request封装为Call
Call call = client.newCall(request);
4、根据需要调用同步或者异步的请求方法
同步调用,返回Response,会抛出IO异常 同步调用会阻塞主线程,一般不适用 Response response = call.execute(); 异步调用,并设置回调函数 异步调用的回调函数是在子线程,我们不能在子线程更新UI, 需要借助于runOnUiThread()方法或者Handler来处理 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show(); } @Override public void onResponse(Call call, final Response response) throws IOException { final String res = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { contentTv.setText(res); } }); } });
OkHttp进行Post请求提交键值对
1、拿到OkHttpClient对象
- OkHttpClient client = new OkHttpClient();
2、构建FormBody,传入参数
FormBody formBody = new FormBody.Builder() .add("username", "admin") .add("password", "admin") .build();
3、构建Request,将FormBody作为Post方法参数传入
final Request request = new Request.Builder() .url("http://www.jianshu.com/") 这里的rul可以是别的设置好的string格式的地址 .post(formBody) .build();
4、将Request封装为Call
Call call = client.newCall(request);
5、调用请求 重写回调方法
call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Toast.makeText(OkHttpActivity.this, "Post Failed", Toast.LENGTH_SHORT).show(); } @Override public void onResponse(Call call, Response response) throws IOException { final String res = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { contentTv.setText(res); } }); } });
进行Post传输字符串
//创建一个OkHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //创建一个RequestBody,即需要传输的json放入request中进行传输 RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"),json); //创建一个请求对象 Request request = new Request.Builder() .url(url_data) .post(requestBody) .build(); Call call=okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { .. } @Override public void onResponse(Call call, Response response) throws IOException { .. } });
进行Post传输文件
方法类同传输json字符串,重要的是设置好RequestBody,txt文件也类同如此,设置好RequestBody就可以了。
File file = new File(Environment.getExternalStorageDirectory(), "1.png"); if (!file.exists()){ Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show(); }else{ RequestBody requestBody2 = RequestBody.create(MediaType.parse("application/octet-stream"), file); 代码中的application/octet-stream表示文件是任意二进制数据流,当然也可以换成更具体的image/png }
同时注意需要在xml文件中添加权限代码:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
进行Post传输表单及联动传输图片、字符串等
我们在网页上经常会遇到用户注册的情况,需要你输入用户名,密码,还有上传头像,这其实就是一个表单,那么接下来我们看看如何利用OkHttp来进行表单提交。经过上面的学习,会发现主要的区别就在于构造不同的RequestBody传递给post方法即可。
引入okio.jar包
compile 'com.squareup.okio:okio:1.11.0'
这里我们会用到一个MuiltipartBody,这是RequestBody的一个子类,我们提交表单就是利用这个类来构建一个RequestBody,下面的代码我们会发送一个包含用户民、密码、头像的表单到服务端,同时也需要记得记得在AndroidManifest.xml文件中添加存储卡读写权限。
File file = new File(Environment.getExternalStorageDirectory(), "1.png"); /也可以在这里定义好filepath到时候直接在下面的代码中传入 if (!file.exists()){ Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show(); return; } RequestBody muiltipartBody = new MultipartBody.Builder() /如果提交的是表单一定要设置这句 .setType(MultipartBody.FORM) .addFormDataPart("username", "admin")/第一个双引号是键值对的键,第二个是值 .addFormDataPart("password", "admin")/第一个双引号是键值对的键,第二个是值 .addFormDataPart("myfile", "1.png", /第二个参数这里可以换成设置好的路径filepath如下行代码所示/ RequestBody.create(MediaType.parse("application/octet-stream"), file)) /.addFormDataPart("myfile", filepath,RequestBody.create(MediaType.parse("application/octet-stream"), file)) .build();