当前位置: 首页 > news >正文

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));}});

http://www.dtcms.com/a/519779.html

相关文章:

  • 住房建设部官方网站公示公告手机网站内容模块
  • 网站建设 数据库连接网站建设公司软件开
  • 深入理解栈与队列:核心特性与实战应用
  • 如何建一个免费的网站南昌做网站优化哪家好
  • 机器学习概念,算法原理及应用
  • Pytorch常用层总结
  • 【Deepseek OCR】重磅测试,mac环境下的体验【本人已经本地实验成功】
  • 轻量化(Lightweight)概念
  • [人工智能-大模型-58]:模型层技术 - 深度神经网络的本质是一个复杂的复合数学函数
  • 【小白笔记】将十进制数(Decimal)转换为二进制数(Binary),并计算二进制表示中“1”的个数
  • 长春怎么注册网站平台wordpress 视频列表
  • 【ReAcTable】面向表格问答任务的ReAct增强框架
  • Docker 部署 Elasticsearch 全流程手册
  • React 集成Redux数据状态管理 数据共享 全局共享
  • Docker与Nginx:现代Web部署的完美二重奏
  • 【JUnit实战3_08】第四章:从 JUnit 4 迁移到 JUnit 5
  • React 03
  • 前端基础之《React(2)—webpack简介-使用Babel》
  • 广州网站建设公司嘉御建设手机银行网站
  • 【Linux系统编程】软件包管理器
  • 怎么快速定位bug?如何编写测试用例?
  • NetIP,一款开源的快速网络信息查看工具
  • 有限元方法核心原理与学习路径:从一维基础到多维拓展(七步流程)
  • TCP(滑动窗口/拥塞窗口补充)
  • nginx前端部署与Vite环境变量配置指南
  • webrtc getStats 内部调用流程分析
  • 通过 Stdio(标准输入/输出)传输机制,实现 CrewAI 与本地 MCP 服务器的连接
  • 英文版网站建设方案手机app免费制作
  • 通过API网关部署FC函数
  • 单例模式精写