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() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {//请求失败Log.d(TAG, e.getMessage());}@Overridepublic 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() {@Overridepublic void onFailure(Call call, IOException e) { // 请求失败// 回到主线程操纵界面runOnUiThread(() -> tv_result.setText("调用登录接口报错:"+e.getMessage()));}@Overridepublic 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() {@Overridepublic void onFailure(Call call, IOException e) { // 请求失败// 回到主线程操纵界面runOnUiThread(() -> tv_result.setText("调用登录接口报错:"+e.getMessage()));}@Overridepublic void onResponse(Call call, final Response response) throws IOException { // 请求成功String resp = response.body().string();// 回到主线程操纵界面runOnUiThread(() -> tv_result.setText("调用登录接口返回:\n"+resp));}});
