package com.example.administrator.okhttp; import android.Manifest; import android.annotation.TargetApi; import android.content.pm.PackageManager; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import java.io.File; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 使用: // compile 'com.squareup.okhttp3:okhttp:3.6.0' // compile 'com.squareup.okio:okio:1.11.0' // * 注意:okhttp内部依赖okio,别忘了同时导入okio // 权限: // * <uses-permission android:name="android.permission.INTERNET" /> // * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> // * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> //OKhttp GET同步请求 public void getTongBu(View view) { new Thread() { @Override public void run() { //1.创建一个okHttp客户端对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.创建请求对象 默认是GET方式 .build是创建 Request request = new Request.Builder() .url("https://www.zhaoapi.cn/ad/getAd").build(); //3.客户端要去调用一个请求的对象 Call call = okHttpClient.newCall(request); try { //4.执行....指定同步还是异步请求的方式....call.execute()同步的方式 Response response = call.execute(); //如果响应成功的话 log响应的内容打印 if (response.isSuccessful()) { //这是打印响应的内容 Log.i("------", response.body().string()); //将这个更新UI的请求消息,加入到事件队列,等待主线程空闲的时候执行 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "GET同步请求到了数据!", Toast.LENGTH_LONG).show(); } }); } } catch (Exception e) { e.printStackTrace(); } } }.start(); } //Get异步请求 public void getYiBu(View view) { //1.创建一个okHttp客户端对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.创建请求对象 默认是GET方式 .build是创建 Request request = new Request.Builder() .url("https://www.zhaoapi.cn/ad/getAd").build(); //3.客户端要去调用一个请求的对象 Call call = okHttpClient.newCall(request); //指定call对应的方法 重写两个方法 call.enqueue(new Callback() { //请求失败的时候 @Override public void onFailure(Call call, IOException e) { //打印异常的日志 e.printStackTrace(); } //请求成功的时候 @Override public void onResponse(Call call, Response response) throws IOException { //将这个更新UI的请求消息,加入到事件队列,等待主线程空闲的时候执行 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "GET异步请求到了数据!", Toast.LENGTH_LONG).show(); } }); } }); } // post和get都有同步和异步的方式.....区别就在于call调用的方法不同 //Post同步请求 post相当于用表单的形式提交 public void PostYiBu(View view) { //创建一个okHttp客户端对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.传递参数使用FormBody请求实体对象 FormBody builder = new FormBody.Builder() //相当于是以键值对形式 把 用户名和密码存起来 .add("mobile", "13715317587") .add("password", "123456") .build(); //3.获取post方式的请求对象 Request request = new Request.Builder() //把上面的参数包装进来 .post(builder) //发送到这个地址 .url("https://www.zhaoapi.cn/user/reg") //创建 .build(); //4.客户端要去调用一个请求的对象 Call call = okHttpClient.newCall(request); //指定call对应的方法 重写两个方法 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //打印错误 e.printStackTrace(); } @Override public void onResponse(Call call, final Response response) throws IOException { //响应成功的时候 if (response.isSuccessful()) { //发送回主线程 runOnUiThread(new Runnable() { @Override public void run() { try { Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } }); } } }); } //上传文件 public void PostShangChuan(View view) { //A.检查用户是否已经允许了权限....
//PackageManager.PERMISSION_GRANTED代表的是用户已经允许 if (ContextCompat.checkSelfPermission
(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) { //B.不允许...的时候,,,请求用户允许这个权限 // Activity arg0代表当前的activity,
//@NonNull String[] arg1请求的权限的数组,也就是需要请求允许哪些权限, int arg2请求码 ActivityCompat.requestPermissions
(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001); }else { //允许...上传文件 postFile(); } } /** * C.请求权限的结果....可以获取到用户是否允许了权限 */ @TargetApi(23) @Override public void onRequestPermissionsResult
(int requestCode,String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1001) { //grantResults用户允许权限的返回值....数组里面放的是用户是否允许权限 //PackageManager.PERMISSION_GRANTED允许权限 if (grantResults.length>0
&& grantResults[0]==PackageManager.PERMISSION_GRANTED) { //上传 postFile(); }else { Toast.makeText(MainActivity.this, "拒绝", Toast.LENGTH_SHORT).show(); } } } private void postFile() { // 1.获取对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.指定文件的类型
//这里text/x-markdown可以是 image/jpg image/png video/mp4 ...mimeType MediaType mediaType = MediaType.parse("text/x-markdown;charset=utf-8"); //3.指定要上传的文件对象 File file = new File(Environment.getExternalStorageDirectory(),"note01.md"); Request request = new Request.Builder() //上传文件的时候请求体使用RequestBody.create()
//获取okhttp3.MediaType contentType 文件的类型,@NotNull java.io.File file上传的文件对象 .post(RequestBody.create(mediaType, file)) .url("https://api.github.com/markdown/raw") .build(); //4. Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, final Response response) throws IOException { if (response.isSuccessful()){ runOnUiThread(new Runnable() { @Override public void run() { try { Toast.makeText(MainActivity.this,response.body().string(),Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } }); } } }); } }