okhttp框架的最简单的基本使用 post和get请求以及用gson解析请求的数据

来源:互联网 发布:天擎网络 编辑:程序博客网 时间:2024/06/07 20:26

前言

         OkHttp是一个高效的HTTP库

              Ø  支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求;

              Ø  如果SPDY不可用,则通过连接池来减少请求延时;

              Ø  无缝的支持GZIP来减少数据流量;

              Ø  缓存响应数据来减少重复的网络请求。

l  引入依赖

compile 'com.squareup.okhttp3:okhttp:3.2.0'compile 'com.squareup.okio:okio:1.7.0'compile 'com.google.code.gson:gson:2.2.4'
以代码为例
创建布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_horizontal"        android:orientation="horizontal">        <Button            android:id="@+id/bt_get"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="Get请求" />        <Button            android:id="@+id/bt_post"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="Post请求" />        >    </LinearLayout>    <TextView        android:hint="请求结果"        android:id="@+id/tv_show"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    ></LinearLayout>
显示效果如下:

实例化参数
public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private Button bt_get;    private Button bt_post;    TextView mtv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mtv = (TextView) findViewById(R.id.tv_show);        bt_get = (Button) findViewById(R.id.bt_get);        bt_post = (Button) findViewById(R.id.bt_post);        bt_get.setOnClickListener(this);        bt_post.setOnClickListener(this);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.bt_get:                           get();                break;            case R.id.bt_post:                             post();                break;        }    }

1.   Http-GET

1)        OkHttpClient:新建一个OkHttpClient实例,用于处理请求。

2)        Request:构建请求参数,如url,请求方式,请求参数,header等。

3)        Call:生成一个具体请求实例,相当于将请求封装成了任务;两种方式:

           ①、call.execute(),非异步方式,会阻塞线程,等待返回结果。

           ②、call.enqueue(Callback),异步方式。

4)      Response:结果响应。

void get(){    final String url = "http://api.map.baidu.com/telematics/v3/weather?location=嘉兴&output=json&ak=5slgyqGDENN7Sy7pw29IUvrZ";//{"{"status":201,"message":"A"status":201,"message"PP被用户自己禁用,请在控制台解禁"}为请求的数据结果    OkHttpClient okHttpClient = new OkHttpClient();    final okhttp3.Request request = new okhttp3.Request.Builder()            .url(url)            .build();    Call call = okHttpClient.newCall(request);    call.enqueue(new Callback() {        public void onFailure(Call call, IOException e) {            Log.e("dsa", "onFailure() e=" + e);        }        public void onResponse(Call call, final Response response) throws IOException {           // Log.i("sdfgsfd", " onResponse() reuslt=" + response.body().string());            Gson gson = new Gson();            final Util util = gson.fromJson(response.body().string(), Util.class);            /res            Log.i("sadsa", util.getMessage() + "");
            runOnUiThread(new Runnable() {                @Override                public void run() {                    
               mtv.setText("message=   "+util.getMessage()+"status=   "+util.getStatus()+"");
// mtv.setText(util.getStatus()+"");  
    }         
   });    
    }   
 });
}

说明:

    ① onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()。

    ②  Callback的onFailure()及onResponse()运行在非主线程,不能在该方法中直接进行UI操作。


2.   Http-POST

POST请求跟Get基本相同,需要增加RequestBody来存储请求的参数信息;在Request.Builder中增加post(RequestBody)调用。

void post(){    OkHttpClient okHttpClient = new OkHttpClient();    RequestBody requestBody = new FormBody.Builder()            .add("key", "value")            .build();    final okhttp3.Request request = new okhttp3.Request.Builder()            .url("http://api.map.baidu.com/telematics/v3/weather?location=嘉兴&output=json&ak=5slgyqGDENN7Sy7pw29IUvrZ")            .post(requestBody)            .build();    okHttpClient.newCall(request).enqueue(new Callback() {        @Override        public void onFailure(Call call, IOException e) {            Log.e("ghfh", "testHttpPost ... onFailure() e=" + e);        }        @Override        public void onResponse(Call call, Response response) throws IOException {          Log.i("fsdhsfd",  response.body().string());        }    });}
以上输出截图如下:


最后Util.class

public class Util {    public String message;    int status;    public String getMessage() {        return message;    }    public void setMessage(String message)    {        this.message = message;    }        public int getStatus() {        return status;    }    public void setStatus(int status) {        this.status = status;    }

1 0
原创粉丝点击