【安卓开发】Android初级开发(okhttp3发送带header与带参数的GET请求)

1.首先需要先加入相应依赖

dependencies{implementation 'com.squareup.okhttp3:okhttp:3.13.1'
implementation 'com.squareup.okio:okio:2.2.2'}

2.加入互联网权限

    <!-- 互联网 -->
    <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" /> <!-- 开关网络状态 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

3.加入网络白名单 

相关链接

package xxxxxxxxxxxxxxxxxxx;

import android.util.Log;

import java.io.IOException;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import okhttp3.Headers;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class HttpUtils {
    //发送get请求,带参数
    public static Map<String, Object> sendGet_body(String url, Map<String, String> map_header, Map<String, String> map_body) throws IOException, IOException {
        //添加header
        Headers.Builder builder_header = new Headers.Builder();
        for (String key : map_header.keySet()) {
            builder_header.add(key, Objects.requireNonNull(map_header.get(key)));
        }
        Headers headers = builder_header.build();
        //添加body
        HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
        for (String key : map_body.keySet()) {
            Log.d(key,Objects.requireNonNull(map_body.get(key)));
            urlBuilder.addQueryParameter(key, map_body.get(key));
        }
        //发送请求
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(urlBuilder.build()).headers(headers).build();
        LocalTime startTime = LocalTime.now();//响应开始时间
        Response response = client.newCall(request).execute();
        LocalTime endTime = LocalTime.now();//响应结束时间
        int code = response.code();
        Log.d("HTTP返回代码",String.valueOf(code));
        if (code != 200) {
            Log.e("HTTP连接提示", "http连接失败");
        }
        Map<String, Object> map = new HashMap<>();
        map.put("code", code);
        Log.d("获取body内容",Objects.requireNonNull(response.body()).string());
        response.close();
        return map;
    }

}

4.1     Request是OkHttp中访问的请求包含以下这些, URL请求的网络地址;method方法,包括get , post ;   headers 请求头    body  请求体 。Builder是辅助类。

 

4.2    Call负责发送情况并接受返回,Response即OkHttp中的响应,

同步阻塞方法:

异步请求方法:

Callback中okhttp请求失败会调用 onFailure   , 其他情况会调用 onResponse    

 

 

4.3 Response包含内容

  response.isSuccessful() //用来判断是否获取响应内容
  String  string = response.body().string(); //body获取响应体,string转换为string类型字符串

完整的网络请求

package com.sina.myokhttp;

import android.renderscript.RenderScript;

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

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

public class OkhttpGetORPost {

    private final OkHttpClient httpClient = new OkHttpClient();

    //同步阻塞的GET方法
    public void OkHttpGet() throws IOException {
        //防止在主UI线程中阻塞,使用后台线程
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                Request.Builder builder = new Request.Builder();
                builder.url("http://china.cn");
                Request request = builder.build();

                Call call = httpClient.newCall(request);
                try {
                    //取出了返回的对象
                    Response response = call.execute();
                    if(response.isSuccessful())
                    {
                        //判断对象是否为空
                        response.body().toString();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    }


    //POST异步请求
    public void OkHttpPost()
    {
        //确定类型
        final MediaType JSON =MediaType.parse(
                "application/json; charset=utf-8"
        );

        Request.Builder builder = new Request.Builder();
        builder.url("http://china.cn");
        builder.post(RequestBody.create(JSON,""));
        Request request = builder.build();
        Call call =  httpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful())
                {
                    //判断对象是否为空
                    response.body().toString();
                }
            }
        });



    }

    //携带Head的POST异步请求
    public void OkHttpPostHead()
    {
        Request.Builder builder = new Request.Builder();
        builder.url("http://china.cn");
        Request request = builder.build();

        Call call =  httpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

              //获取响应的CODE
             int code = response.code();

             //获取Heads
              Headers headers = response.headers();

              //获取Content-Type
              String contentType = headers.get("Content-Type");


            }
        });


    }


}

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༄yi笑奈何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值