免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵Python学院
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:9.安卓逆向-安卓开发基础-安卓四大组件2
前面的都是ui界面开发,接下来开始安卓网络开发的部分
请求
安卓中通常会使用OkHttp3库(框架)来处理HTTP请求、处理响应以及与服务器进行通信。
以下是
OkHttp3
的一些主要特点和功能:
- 简单易用:
OkHttp3
提供了简洁的API
,使得发送HTTP
请求变得简单和直观。它支持常见的HTTP
方法(GET、POST、PUT、DELETE
等)和请求参数的设置,可以轻松构建出各种类型的请求。- 高效性能:
OkHttp3
针对性能进行了优化,使用了连接池和请求复用等机制,减少了网络请求的延迟和资源消耗。它还支持HTTP/2、SPDY
和连接的压缩,提供更快的网络传输速度。- 强大的拦截器:
OkHttp3
提供了拦截器(Interceptor
)机制,可以在发送请求和接收响应的过程中进行自定义的处理操作。你可以添加和配置多个拦截器,以实现日志记录、请求重试、请求头修改等功能。- 支持异步请求:
OkHttp3
支持发送异步请求,可以利用线程池并发地发送多个请求,从而提高请求的性能和吞吐量。同时,它还支持同步请求,即在当前线程中执行请求并等待返回结果。- 文件上传和下载:
OkHttp3
提供了方便的API
,用于实现文件的上传和下载功能。通过设置请求体和响应处理器,可以轻松地实现大文件的分块上传和断点续传等操作。- 支持
WebSocket
:除了常见的HTTP
请求,OkHttp3
还支持使用WebSocket
进行双向通信。它提供了WebSocket API
,可以在应用程序中实现实时的消息推送和数据交互。
项目中使用OkHttp3
首先如下图添加
implementation 'com.squareup.okhttp3:okhttp:3.14.2' // 用于发送请求 implementation 'com.squareup.okio:okio:1.17.4' // 用于快速的访问、存储和处理你的数据
然后添加了上面的代码,然后点击下图红框位置,点击之后它会把okhttp3的库下载下载,下载完就可以用了
然后开始使用:
首先创建一个空的Activity,如下图
然后添加下图红框的代码
package com.example.course1; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class OkHttp3Dome extends AppCompatActivity { public OkHttpClient client = new OkHttpClient(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ok_http3_dome); // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么 Request request = new Request.Builder() .url("https://www.baidu.com") // 设置请求的 URL .build(); // newCall请求地址,enqueue里面是请求成功还是失败 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中 // 请求失败,处理错误 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法 // 请求成功,处理响应数据 if (response.isSuccessful()) { String responseData = response.body().string(); System.out.println(responseData); // 在这里处理响应数据 } else { // 请求失败,处理错误 // 可以根据 response.code() 判断具体的失败原因 } } }); } }
然后还要修改一下清单文件
如果不添加下方的代码app无法联网,效果就是闪退
<uses-permission android:name="android.permission.INTERNET" />
点击运行之后就会打印百度的服务器返回的内容了,如下图
然后上图它没有换行自动换行可能看着不好,如下图点击下图蓝框可以超长自动换行
上方的例子是一个GET请求的实例,接下来写post请求的实例
首先要找一个post的链接,巨潮资讯网,下图红框的内容就是一个post请求,接下来通过OkHttp3访问这个请求,以下只是为了学习参考,不会做违法的事情,读者们也不要做违法的事情,不要对网链接进行大量请求导致网页无法正常运行
它的链接是,如下图按F12打开浏览器的控制台,然后找到Network,然后翻页,然后就能看到query了,如果看不到那就是网页更新了,就算更新了也会有类似query的链接
然后单击query,下图红框就是query的链接
下图红框就是query请求给服务器发送的参数(数据)
知道这些以后开始访问它
参数
post请求的请求头中需要添加一个Content-Type用来说明post请求参数的格式,如下图直接复制粘贴
package com.example.course1; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class OkHttp3Dome extends AppCompatActivity { public OkHttpClient client = new OkHttpClient(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ok_http3_dome); post请求(); } public void get(){ // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么 Request request = new Request.Builder() .url("https://www.baidu.com") // 设置请求的 URL .build(); // newCall请求地址,enqueue里面是请求成功还是失败 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中 // 请求失败,处理错误 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法 // 请求成功,处理响应数据 if (response.isSuccessful()) { String responseData = response.body().string(); System.out.println(responseData); // 在这里处理响应数据 } else { // 请求失败,处理错误 // 可以根据 response.code() 判断具体的失败原因 } } }); } public void post请求(){ // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么 FormBody formBody = new FormBody.Builder() // 构建给服务器发送的数据 .add("pageNum","1") .add("pageSize","30") .add("column","szse") .add("tabName","fulltext") .add("plate","") .add("stock","") .add("searchkey","") .add("secid","") .add("category","category_gddh_szsh") .add("trade","") .add("seDate","2024-03-22~2024-09-23") .add("sortName","") .add("sortType","") .add("isHLtitle","").build(); Request request = new Request.Builder() .url("http://www.cninfo.com.cn/new/hisAnnouncement/query") // 设置请求的 URL .post(formBody) // 设置post请求的请求参数(也就是通过post的方式给服务器发送的数据) .addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")// 设置请求头 .build(); // newCall请求地址,enqueue里面是请求成功还是失败 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中 // 请求失败,处理错误 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法 // 请求成功,处理响应数据 if (response.isSuccessful()) { String responseData = response.body().string(); System.out.println(responseData); // 在这里处理响应数据 } else { // 请求失败,处理错误 // 可以根据 response.code() 判断具体的失败原因 } } }); } }
写完点运行会报下图的错,原因是安卓29版本(安卓api级别29)默认禁止访问http的api(api的意思是现在可以理解为安卓系统提供的一些可以让我们用的功能),需要设置一下让它允许访问
首先在清单文件中
android:networkSecurityConfig="@xml/network_security_config"
然后点击下图红框在res文件夹里创建一个文件夹叫xml
然后点击XML Resource File
然后点击下图红框
然后输入下图红框的内容
<network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
然后再点运行,就可以看到 http://www.cninfo.com.cn/new/hisAnnouncement/query 链接给返回的数据了
如下图可以看到一模一样
上方的实例是 application/x-www-form-urlencoded 类型,这个类型叫表单类型,上方用 FormBody 就是一个application/x-www-form-urlencoded 类型,FormBody 会把数据搞成application/x-www-form-urlencoded 类型,然后post常用的还有json类型,json与application/x-www-form-urlencoded可以说是一个东西
然后找一个json的post请求,如下图百度翻译采用的是post请求
它的参数
它返回的东西
开始写代码
package com.example.course1; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class OkHttp3Dome extends AppCompatActivity { public OkHttpClient client = new OkHttpClient(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ok_http3_dome); // post请求(); json请求(); } public void get(){ // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么 Request request = new Request.Builder() .url("https://www.baidu.com") // 设置请求的 URL .build(); // newCall请求地址,enqueue里面是请求成功还是失败 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中 // 请求失败,处理错误 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法 // 请求成功,处理响应数据 if (response.isSuccessful()) { String responseData = response.body().string(); System.out.println(responseData); // 在这里处理响应数据 } else { // 请求失败,处理错误 // 可以根据 response.code() 判断具体的失败原因 } } }); } public void post请求(){ // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么 FormBody formBody = new FormBody.Builder() // 构建给服务器发送的数据 .add("pageNum","1") .add("pageSize","30") .add("column","szse") .add("tabName","fulltext") .add("plate","") .add("stock","") .add("searchkey","") .add("secid","") .add("category","category_gddh_szsh") .add("trade","") .add("seDate","2024-03-22~2024-09-23") .add("sortName","") .add("sortType","") .add("isHLtitle","").build(); Request request = new Request.Builder() .url("http://www.cninfo.com.cn/new/hisAnnouncement/query") // 设置请求的 URL .post(formBody) // 设置post请求的请求参数(也就是通过post的方式给服务器发送数据) .addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")// 设置请求头 .build(); // newCall请求地址,enqueue里面是请求成功还是失败 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中 // 请求失败,处理错误 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法 // 请求成功,处理响应数据 if (response.isSuccessful()) { String responseData = response.body().string(); System.out.println(responseData); // 在这里处理响应数据 } else { // 请求失败,处理错误 // 可以根据 response.code() 判断具体的失败原因 } } }); } public void json请求(){ // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么 JSONObject json = new JSONObject(); try { json.put("query", "pya"); } catch (JSONException e) { e.printStackTrace(); } // 创建请求体 MediaType mediaType = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(mediaType, json.toString()); Request request = new Request.Builder() .url("https://fanyi.baidu.com/langdetect") // 设置请求的 URL .post(body) // 设置post请求的请求参数(也就是通过post的方式给服务器发送的数据) .build(); // newCall请求地址,enqueue里面是请求成功还是失败 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中 // 请求失败,处理错误 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法 // 请求成功,处理响应数据 if (response.isSuccessful()) { String responseData = response.body().string(); System.out.println(responseData); // 在这里处理响应数据 } else { // 请求失败,处理错误 // 可以根据 response.code() 判断具体的失败原因 } } }); } }
效果图: