




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2相关知识34任务小结与练习1任务实施任务引入与目标HTTP请求与响应一、任务引入与目标任务目标在任务4中,我们将学习OkHttp框架,在APP中创建HTTP客户端,通过GET、POST以及同步、异步方式向服务器发送HTTP请求,接收到HTTP响应后将相应的数据部分取出处理。有些Web服务器提供了API接口,HTTP客户端只要按照约定向Web服务器发送HTTP请求,就会获取期望的返回数据。任务引入HTTP全称为HyperTextTransferProtocol,即超文本传输协议,是互联网上应用最广泛的一种网络协议。与浏览器Web应用一样,开发物联网APP时,一部分数据也需要通过HTTP请求向服务器获取。那么在AndroidStudio中有没有简便的方法进行HTTP的请求与响应呢?二、相关知识HTTP协议HTTP是一种可扩展的协议,是一种应用层协议,是运行在TCP之上的。因为具有良好的扩展性,所以HTTP协议不仅被用来传输超文本文档,还被用来传输图片或视频以及提交HTML表单等信息。用户通过浏览器输入url提交请求,就是使用的HTTP协议。HTTP的使用比较简单,HTTP报文允许简单测试,容易读懂,开发门槛较低。OkHttp框架OkHttp是Android开发的最常用的网络请求框架,由Square公司开源。OkHttp可以理解为是一个HTTP层面的框架,它的工作原理简单来说就是:(1)首先利用socket建立与服务器的TCP连接;(2)然后将符合HTTP协议的请求报文拼接好并传递到服务器;(3)最后读取服务器的响应。除了基本的HTTP使用,OkHttp还提供了线程池,以此来执行异步请求。二、相关知识相关链接OkHttp框架使用流程如图2-25所示:(1)通过newOkHttpClient()创建HTTP客户端对象;(2)通过Request.Builder创建Request请求对象(用于请求包);(3)通过调用HTTP客户端对象的newCall方法,传入Request对象,生成Call对象(用于发送请求);(4)由Call对象调用execute或enqueue方法提交请求,得到响应Response。注意,如图2-25所示,同步请求和异步请求的前三步一样,包括创建HTTP客户端对象、创建Request请求包、创建发送请求Call对象。但第四步不同:如果同步请求Call对象调用execute()方法,则直接请求;如果异步请求Call对象调用enqueue()方法,则将请求加入队列中。图2-25OkHttp框架使用流程OkHttp使用流程OKHttp官网:https://square.github.io/okhttp/。二、相关知识GET请求方法OkHttp官网提供了GET请求方法的示例,代码如下:OkHttpClientclient=newOkHttpClient();Stringrun(Stringurl)throwsIOException{Requestrequest=newRequest.Builder().url(url).build();try(Responseresponse=client.newCall(request).execute()){returnresponse.body().string();}}在示例的GET方法中:(1)通过newOkHttpClient()创建了HTTP客户端对象client;(2)创建了请求包对象request,调用url()方法设置要直接访问的url(参数包含在url中,即GET方法);(3)调用newCall()方法生成call对象,调用execute()方法(即同步请求)得到响应response,并通过body()方法获取响应的数据部分。二、相关知识POST请求方法OkHttp官网提供了POST请求方法的示例,代码如下:publicstaticfinalMediaTypeJSON=MediaType.get("application/json;charset=utf-8");OkHttpClientclient=newOkHttpClient();Stringrun(Stringurl,Stringjson)throwsIOException{Requestrequest=newRequest.Builder().url(url).post(body).build();try(Responseresponse=client.newCall(request).execute()){returnresponse.body().string();}}在示例的POST方法中:(1)通过newOkHttpClient()创建了HTTP客户端对象client;(2)将参数放在RequestBody类对象中,后面通过POST方法提交;(3)创建了请求包对象request,调用url()方法设置url,并调用POST方法设置要提交的一些参数(即POST方法);(4)调用newCall()方法生成call对象,调用execute()方法(即同步请求)得到响应response,并通过body()方法获取响应的数据部分。二、相关知识在HTTP请求方法中,有哪些组合形式?课堂讨论三、任务实施实施设备安装了AndroidStudio开发环境的计算机。实施过程1.创建工程及配置(1)添加框架。如图2-26所示,新建Android工程“OKHttpClient”,在app→build.gradle中添加viewBinding框架:图2-26添加viewBinding和OkHttp框架android.buildFeatures.viewBinding=true添加OkHttp框架:mplementationc'om.squareup.okhttp3:okhttp:5.0.0-alpha.10'点击同步。三、任务实施(2)编写HTTP请求的配置文件。如图2-27所示,在res的xml文件夹,新建network_security_config.xml文件,代码如下:<?xmlversion="1.0"encoding="utf-8"?><network-security-config><base-configcleartextTrafficPermitted="true"/></network-security-config>图2-27编写HTTP请求的配置文件Android系统限制了HTTP协议明文流量的网络请求,对HTTPS是没有影响的。本任务中会使用到HTTP,所以需要编写网络安全配置文件,将cleartextTrafficPermitted设置为“true”。三、任务实施(3)添加网络权限。如图2-28所示,允许程序打开网络套接字:<uses-permissionandroid:name="android.permission.INTERNET"/>图2-28添加网络权限然后通过networkSecurityConfig配置,开启非加密的HTTP网络请求(也可以不要):android:networkSecurityConfig="@xml/文件名"三、任务实施2.页面布局设计activity_main.xml布局文件的代码如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="warp_content" android:text=“测试同步请求“/><TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content"/>三、任务实施在布局文件中,设计了2个按钮(用于测试同步和异步请求)和2个文本框(用于显示响应值)。两个按钮控件的id分别是btn1和btn2,两个文本框控件的id分别textView1和textView2。<Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="warp_content" android:text=“测试异步请求“/><TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content"/></LinearLayout>三、任务实施3.活动文件设计(1)创建对象。如图2-29所示,在MainActivity.java活动文件中,创建了一个ActivityMain-Binding对象binding和一个HTTP客户端对象okHttpClient。okHttpClient对象通过OkHttpClient.Builder()构造,并调用build方法实例化。图2-29MainActivity活动中创建对象三、任务实施(2)两个按钮的单击事件监听。代码如下:binding.btn1.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ testGet_s(); }});binding.btn2.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ testPost_as(); }});在btn1的单击事件监听里面,调用了同步请求函数testGet_s。在btn2的单击事件监听里面,调用了异步请求函数testPost_as。所谓同步请求,就是直接请求;所谓异步请求,就是把请求加入enqueue(队列)中,等待执行。下面分别编写这两个同步请求函数和异步请求函数:在同步请求函数中用GET方法,在异步请求函数中用POST方法。当然这个也根据自己的需要选择。三、任务实施(3)btn1的同步请求函数testGet_s。代码如下://同步请求函数
privatevoidtestGet_s(){
//创建请求对象
Requestrequest=newRequest.Builder()
.url("/v7/weather/now?location=101010100&key=d7ac748d2e2447cdb8d42e13451a646d")
.build();
//开启子线程,因操作耗时不能在主线程中执行
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//创建响应对象,客户端的newCall就是发起请求的方法,execute是直接执行即同步请求,返回即是响应
Responseresponse=okHttpClient.newCall(request).execute();
//获取响应的数据部分
Stringresult=response.body().string();
//在主线程更新UI,即在textView1文本框中显示三、任务实施
//在主线程更新UI,即在textView1文本框中显示
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
binding.textView1.setText(result);
}
});
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
}在testGet_s函数中:①创建了请求包对象request,调用url()方法设置要直接访问的url(参数包含在url中,即GET方法);②HTTP客户端调用newCall()方法生成call对象,调用execute()方法(即同步请求)得到响应response,并通过body()方法获取响应的数据部分。三、任务实施注意:因为HTTP网络请求耗时,所以需要开启子线程,在子线程中发起请求;当获取到响应的数据部分后,需要开启UI线程,在UI线程中更新UI;因为可能出现的异常情况,程序中进行了异常的捕获和处理。还要注意在btn1的单击事件监听中,需要调用testGet_s同步请求函数。单击测试同步请求按钮,在APP中测试,可以成功获取到返回的天气情况,并展示出来,如图2-30所示,图中还展示了通过浏览器查询的结果。图2-30在APP中测试同步请求三、任务实施登录/,使用和风天气API,注册后可获得自己的key,然后给出要查询城市的Location_ID即可如:/v7/weather/now?location=101010100&key=d7ac748d2e2447cdb8d42e13451a646d其中的101010100是北京的Location_ID。相关链接Devapi参考文档:/docs/api/weather/weather-now/。三、任务实施(4)btn2的异步请求函数testPost_as。//异步请求函数,/get.php,apipost工具
privatevoidtestPost_as(){
//创建表单
FormBodyformBody=newFormBody.Builder()
.add("username","1")
.build();
//将表单数据放入request中,通过post方法提交
Requestrequest=newRequest.Builder()
.url("/get.php")
.post(formBody)
.build();
//将客户端请求加入到队列中,会自动在子线程中运行。返回有2种情况,失败或者有响应
okHttpClient.newCall(request).enqueue(newCallback(){
@Override
publicvoidonFailure(@NonNullCallcall,@NonNullIOExceptione){
e.printStackTrace();
}
@Override在异步方式下,不再需要主动创建子线程,只需要把创建的请求加入队列中即可。testPost_as函数代码如下:三、任务实施@Override
publicvoidonResponse(@NonNullCallcall,@NonNullResponseresponse)throwsIOException{
//获取响应的数据部分
Stringresult=response.body().string();
//在主线程更新UI,即在textView2文本框中显示
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
binding.textView2.setText(result);
}
});
}
});
}函数中创建了一个表单,将表单数据放入request中,通过POST方法提交。将客户端请求加入队列中,会自动在子线程中运行。返回有2种情况:失败或者有响应。如果有响应,则获取响应的数据部分,在主线程更新UI,即在textView2文本框中显示。三、任务实施注意在btn2的单击事件监听中,调用testPost_as异步请求函数。单击测试btn2异步请求按钮,在APP中测试异步请求,如图2-31所示。图2-31在APP中测试异步请求测试发现,可以成功返回数据并展示出来。相关链接pipost工具:/get.php。三、任务实施(5)解决浏览器乱码问题。有的浏览器(HTTP客户端)在HTTP请求返回的消息中出现乱码,是字符编码的问题,可以按以下步骤处理。以Google浏览器为例,首先解压浏览器扩展程序,如图2-32所示。图2-32解压浏览器扩展程序图2-33加载已解压的扩展程序然后加载已解压的扩展程序,如图2-33所示。点击Chrome浏览器地址栏右侧的扩展程序图标,选择Charset右侧的图钉,可以将其固定在地址栏右侧,以方便后续使用。三、任务实施最后,当请求返回数据乱码时,点击Charset图标,选择UTF-8,即可重新发送请求加载页面,请求回来的数据中文不再显示成乱码
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度瑜伽馆合伙经营师资共享协议
- 二零二五年度家校联动学生安全教育与责任落实合同
- 二零二五年度企业员工薪酬福利设计及调整合同
- 二零二五年度滑雪场租赁合同安全保障协议
- 二零二五年度品牌连锁店铺授权经营合同
- 二零二五年度带泳池景观房商品房买卖合同补充条款
- 精细化2024年金融分析师备考方案试题及答案
- 2025年度矿山安全生产及应急救援合作协议
- 2025年度智能科技企业整体转让协议
- 妇幼保健员考试重要考点复习试题及答案
- GB/T 19411-2024除湿机
- 计算机网络基础与应用中职完整全套教学课件
- 2024年山东青岛初中生物会考模拟试卷含解析
- 上海市徐汇南洋中学2024-2025学年高一上学期期中考试英语试卷(无答案)
- 电力系统运行与维护手册
- 15.《真理诞生于一百个问号之后》课件
- 基于人工智能的语音康复评估
- 鸸鹋饲养技术规程
- 医师定期考核人文医学考试题库500题(含参考答案)
- 湖北省七市2025届高三第二次调研物理试卷含解析
- 宁夏银川市银川一中2025届高三第一次模拟考试物理试卷含解析
评论
0/150
提交评论