[1]OkHttp介紹之Get、Post方法

一、作用

一般的get請求
一般的post請求
基於Http的文件上傳
文件下載
加載圖片
支持請求回調,直接返回對象、對象集合
支持session的保持

二、導包
導入okhttp3.6.0和okio包
三、get和post請求
1、get請求
1) OkHttpClient:新建一個OkHttpClient實例,用於處理請求。

2) Request:構建請求參數,如url,請求方式,請求參數,header等。

3) Call:生成一個具體請求實例,相當於將請求封裝成了任務;兩種方式:

       ①、call.execute(),非異步方式,會阻塞線程,等待返回結果。

       ②、call.enqueue(Callback),異步方式。裏面有onFailure()和onResponse()方法只能運行在非主線程,不能進行UI操作。可以用handler去操作UI界面。

4) Response:結果響應。
response.body().string()–>返回字符串(小文檔);
.bytes()–>返回二進制字節數組
.byteStream()–>返回InputStream(超過1M的用這個)
2、Post請求
同上面差不多,但需要增加RequestBody(存放json數據)RequestBody.create(Json,json);或FormBody.Builder(存放表單)FormBody.Builder().add(“key”,”name”);來存儲請求的參數信息,在Request.Builder增加post(RequestBody)的調用。

package com.example.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * author:黃夏蓮
 * time:2017.04.10
 */
public class MainActivity extends AppCompatActivity {

    Executors me;
    ExecutorService executorService;
    String url = "https://www.baidu.com/";
    String []json=new String[]{"abc"};
    private Headers headers;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*  executorService = me.newFixedThreadPool(5);
        for(int i=0;i<20;i++){
             Runnable r = new Runnable() {
               @Override
               public void run() {
                Log.i("TAG",Thread.currentThread().getName());
               }
            };
            executorService.execute(r);
        }*/
        /*1)        OkHttpClient:新建一個OkHttpClient實例,用於處理請求。

        2)        Request:構建請求參數,如url,請求方式,請求參數,header等。

        3)        Call:生成一個具體請求實例,相當於將請求封裝成了任務;兩種方式:

           ①、call.execute(),非異步方式,會阻塞線程,等待返回結果。

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

        4)      Response:結果響應。

*/
        new Thread(new Runnable() {
            @Override
            public void run() {
//                onGetNet();
                try {
                    //提交json數據
//                    String a = post(url,json[0]);
                    String a = postString(url);
                    Log.i("TAG",a);
                    for(int i=0;i<headers.size();i++){
                        Log.i("TAG",headers.name(i)+":"+headers.value(i)+";");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
    //get異步
    public void onGetNet() {
        final String url = "https://www.baidu.com/";
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i("TAG", "網絡請求失敗");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i("TAG", "網絡請求成功" + "response.body().string():" + response.body().string());
            }
        });
    }
    //get非異步
    private String run(String url) throws IOException {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(url)
                .build();

        Response response = client.newCall(request).execute();
        return response.body().string();
    }
    //post
    //①提交json數據
    public static final MediaType JSON
            = MediaType.parse("application/json; charset=utf-8");

    OkHttpClient client = new OkHttpClient();

    String post(String url, String json) throws IOException {
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        return response.body().string();
    }
    //②提交字符串
   String postString(String url)throws IOException {
       FormBody formBody = new FormBody.Builder().add("name", "aaa").add("age", "13").build();
       Request request = new Request.Builder()
               .url(url)
               .post(formBody)
               .build();

       Response response = client.newCall(request).execute();
         headers = response.headers();
       return response.body().string();
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章