Android Studio新手开发第三十天

通过okhttp调用HTTP接口

        虽然Java库中自带的HttpURLConnection能够实现大多数的网络访问操作,但它的用法较为繁琐,需要注意许多细节,稍有不慎可能会报错。于是出现了许多第三方的网络开源框架,如Apache的HttpClient、Square的okhttp。Android9.0开始正式弃用HttpClient,现在主要使用okhttp来进行网络访问操作。

        由于okhttp是第三方框架,需要再模块的build.gradle中添加依赖,如下所示:

implementation "com.squareup.okhttp3:okhttp:4.9.3"

        同时也要在AndroidManifest.xml中添加上网的权限声明,如下所示:

<uses-permission android:name="android.permission.INTERNET" />

        除此之外,由于Android9.0以后开始默认只能访问https开头的安全地址,不能直接访问http开头的网络地址,若想要访问就需要再AndroidManifest.xml的application节点添加属性usesCleartextTraffic并将其值设置为true,表示允许访问http开头的网址。

        okhttp的网络访问功能十分的强大,单就http接口调用而言就有三种访问方式:GET方式的请求、表单格式的POST请求、JSON格式的POST请求。

        1.GET方式的请求,示例代码如下,其中的URL可以自行修改。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp);
        OkHttpClient client = new OkHttpClient();
        String url_t = "https://v.xapi.chat/api/yiyan/api.php?apikey=0d60950d-aa68-0587-3131-b76cbd84531db6f5635e&encode=json/text/html/js";
        Request request = new Request.Builder()
                //.get() 默认为GET方式可以不加
                .url(url_t)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                //请求失败
                Log.d(TAG, e.getMessage());
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                //请求成功
                //只能调用一次
                String json =  response.body().string();
                TextView textView = findViewById(R.id.textView);
                //回到主线程操作界面
                runOnUiThread(()->textView.setText(json));
            }
        });
    }

        效果图如下,上面的URL来自一个免费的api网站至简API,网址为https://v.xapi.chat/,可自行注册使用里面的API。

        2.表单格式的POST请求

        对于okhttp来说POST方式与GET方式的调用过程差不多,主要区别在于如何创建请求结构。post方法既表示本次请求的方式,也用于填入请求参数。下面以登录为例,将用户的信息存入表单中,再将表单作为post方法的请求参数传入。

        String username = "你的用户名";
        String password = "你的密码";
        // 创建一个表单对象
        FormBody body = new FormBody.Builder()
                .add("username", username)
                .add("password", password)
                .build();
        OkHttpClient client = new OkHttpClient(); // 创建一个okhttp客户端对象
        // 创建一个POST方式的请求结构
        Request request = new Request.Builder().post(body).url(URL_LOGIN).build();
        Call call = client.newCall(request); // 根据请求结构创建调用对象
        // 加入HTTP请求队列。异步调用,并设置接口应答的回调方法
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败
                // 回到主线程操纵界面
                runOnUiThread(() -> tv_result.setText("调用登录接口报错:"+e.getMessage()));
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException { // 请求成功
                String resp = response.body().string();
                // 回到主线程操纵界面
                runOnUiThread(() -> tv_result.setText("调用登录接口返回:\n"+resp));
            }
        });

        3.JSON格式的POST请求

        由于表单格式所传递的数据比较少,不能传递复杂的数据,因此常用JSON格式与服务器交互。将设定好的JSON串的字符串编码后再放入RequestBody结构中,示例代码如下,仍以登录为例。

        String username = "你的用户名";
        String password = "你的密码";
        String jsonString = "";
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("username", username);
            jsonObject.put("password", password);
            jsonString = jsonObject.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 创建一个POST方式的请求结构
        RequestBody body = RequestBody.create(jsonString, MediaType.parse("text/plain;charset=utf-8"));
        OkHttpClient client = new OkHttpClient(); // 创建一个okhttp客户端对象
        Request request = new Request.Builder().post(body).url(URL_LOGIN).build();
        Call call = client.newCall(request); // 根据请求结构创建调用对象
        // 加入HTTP请求队列。异步调用,并设置接口应答的回调方法
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败
                // 回到主线程操纵界面
                runOnUiThread(() -> tv_result.setText("调用登录接口报错:"+e.getMessage()));
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException { // 请求成功
                String resp = response.body().string();
                // 回到主线程操纵界面
                runOnUiThread(() -> tv_result.setText("调用登录接口返回:\n"+resp));
            }
        });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值