Retrofit中scalars转换html为字符串

news2025/4/21 19:45:38

简介

        在Retrofit中,如果你想直接获取HTML或其他文本格式的响应内容而不是将其映射到一个模型类,ScalarsConverterFactory 就派上用场了。ScalarsConverterFactory 是一个转换器工厂,它能够将响应体转换为Java基本类型如String、Integer或Byte[]等标量值。对于解析HTML而言,最直接的应用就是将整个HTML内容作为字符串获取。

一、附加依赖

添加依赖包为:

com.squareup.retrofit2:retrofit:2.x.y
com.squareup.retrofit2:converter-scalars:2.x.y
com.squareup.retrofit2:converter-gson:2.x.y
org.jsoup:jsoup:1.17.2

File中找到Project Structure:

        添加Library Dependency

输入网址域名com.squareup.retrofit2

附加成功:

ScalarsConverterFactory.create() 是Retrofit库中的一个转换器工厂方法,它允许Retrofit将HTTP响应体直接转换为Java的基本类型或字符串等标量值,而不是转换为特定的模型对象。这对于处理文本、JSON字符串或二进制数据等非结构化响应非常有用。

二、配置Retrofit

  初始化构建器(Retrofit):

        new Retrofit.Builder() 创建了一个 Retrofit.Builder 实例。Builder 是一个设计模式,它允许你通过一系列配置步骤来创建复杂的对象。在这里,就是用来配置 Retrofit 的各种参数,最终构建出一个 Retrofit 实例。

baseUrl目标地址域名:

        指定所有网络请求的基础 URL。这是所有相对路径请求的基础。

转换器工厂ConverterFactory:

        转换器的作用是将从网络请求得到的响应体转换成 Java 对象。这里使用的 ScalarsConverterFactory 是专门用来处理文本类型的响应体,比如字符串、byte数组等。如果你的 API 返回的是 JSON 数据,通常会使用 GsonConverterFactoryMoshiConverterFactory。

 .build()完成构建:

        最后,调用 build() 方法来完成 Retrofit 实例的创建。这一步会根据之前设置的所有配置项,构建出一个可用的 Retrofit 实例。

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://your.api.base.url/")
        .addConverterFactory(ScalarsConverterFactory.create())
        .build();

三、定义网址(API)接口

接下来,在定义API接口时,并定义网络请求方法getHtmlContent(),可以声明方法返回类型为Call<String>或其他标量类型,例如:

四、发起请求并处理响应

创建接口实例:

        通过retrofit.create(WHttp.class)创建了一个接口WHttp的实例。这里假设WHttp接口定义了网络请求的方法,如getHtmlContent(),这个方法对应于获取HTML内容的网络请求。

获取html内容:

        通过getHtmlContent()方法对应于获取HTML内容的网络请求。

enqueue异步请求:

        call.enqueue()方法发起一个异步HTTP请求。这意味着当请求开始时,应用不会被阻塞,可以继续处理其他任务。请求的结果会在主线程(UI线程)中通过onResponseonFailure回调方法通知。成功响应 (onResponse)与失败响应 (onFailure)。

成功响应 (onResponse):成功响应就可获取html内容,并做解析处理。

失败响应 (onFailure):将错误信息通过Throwable t传入,然后将错误信息简单地设置到一个名为textView的TextView控件中展示给用户。

五、Jsoup解析html

html解析内容:

response.body()获取内容:

        String html = response.body();: 从Retrofit的响应对象中获取HTML内容。这是之前网络请求的结果,存储为一个字符串。

Jsoup解析(Document)html字符串:

        Document doc = Jsoup.parse(html);: 使用Jsoup库来解析这个HTML字符串,创建一个Document对象。Jsoup是一个用于解析HTML的Java库,非常适用于提取和操作HTML数据。

Jsoup的选择器语法:

        String description = doc.select("meta[name=description]").attr("content");: 利用Jsoup的选择器语法,从Document中选择所有<meta>标签,其中name属性为description的元素,并从中提取content属性的值。这通常用来获取网页的描述信息。

传入数据UI控件显示(setText):

        textView.setText(description);: 最后,将提取到的描述信息设置给一个名为textView的TextView组件的文本内容。这将在UI界面上显示提取到的描述信息。

六、启用线程

 new Thread线程:

        new Thread(new Runnable() { ... }): 创建一个新的线程。在Android中,网络请求和耗时操作通常不应在主线程(UI线程)执行,以免阻塞UI导致应用无响应(ANR)。因此,这里使用一个新的线程来执行耗时的HTML解析操作。public void run() { ... }: 这是Runnable接口中的run方法,定义了在线程启动(.start())后要执行的操作

  new Thread(new Runnable() {
                          @Override
                          public void run() {
                             runOnUiThread(new Runnable() {
                                 @Override
                                 public void run() {
                                     String html = response.body();
                                     Document doc = Jsoup.parse(html);
                                     String description = doc.select("meta[name=description]").attr("content");
                                    textView.setText(description);
                                 }
                             });
                          }
                      }).start();

 runOnUiThread UI线程:

        runOnUiThread(new Runnable() { ... }): 因为Android不允许在非UI线程直接更新UI组件,所以这里使用runOnUiThread方法来确保UI更新操作在主线程中执行。runOnUiThread是Activity或View的成员方法,可以接受一个Runnable对象,确保其在UI线程运行。public void run() { ... }: 这是第二个Runnable对象中的run方法,定义了要在UI线程执行的操作。

 runOnUiThread(new Runnable() {
                                 @Override
                                 public void run() {
                                     String html = response.body();
                                     Document doc = Jsoup.parse(html);
                                     String description = doc.select("meta[name=description]").attr("content");
                                    textView.setText(description);
                                 }
                             });

最终效果:

        简要总结:添加依赖包+初始化构建器(baseurl(地址域名),转换器(ConverterFactory),build构建)+实例化接口+调用接口方法获取数据+enqueue异步请求+线程+解析数据

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微服务架构】SpringCloud(七):配置中心 Spring Cloud Config

文章目录 配置中心为什么需要配置中心配置中心介绍 服务搭建基于GITHUB1.创建仓库2.新建微服务作为配置中心服务3.启动测试拉取 匹配规则分支读取 客户端配置配置文件引入依赖使用远程配置 刷新配置手动配置热更新自动刷新erlang安装RabbitMQ安装环境变量管理界面服务配置测试 …

Linux学习笔记(应用篇二)

基于I.MX6ULL.MINI开发板 开发板与电脑相互通信电脑与开发板互传文件 开发板与电脑相互通信 用网线将电脑与开发板连接 本人使用的是Ubuntu系统&#xff0c;不是虚拟机 一般来说刚开始电脑和开发板是ping不通的 首先查看电脑的 IP WinR&#xff0c;cmd调出终端 我使用的是…

记录一次部署k3s后,服务404 page not found,nginx显示正常

服务部署k3s后&#xff0c;正常入口端怎么返回都是80&#xff0c;且返回错误 TRAEFIK DEFAULT CERT ERR_CERT_AUTHORITY_INVALID ngnix显示也是正常&#xff0c;怎么找也找不到问题 后来通过 iptables -L -n -t nat|grep 80 发现入口端流量被DNAT转到新的服务 而k3s中&#…

mac上安装nvm及nvm的基本语法使用!!

种一棵树&#xff0c;最好是十年前&#xff0c;其次是现在&#xff01;想要改变&#xff0c;从此刻开始&#xff0c;一切都不晚&#xff01; 目录 nvm是什么&#xff1f;前提条件&#xff1a;安装homebrew如果系统已经有node版本&#xff1a;在mac上安装nvm&#xff1a;用nvm安…

(基本常识)C++中const与引用——面试常问

作者&#xff1a;求一个demo 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 内容通俗易懂&#xff0c;没有废话&#xff0c;文章最后是面试常问内容&#xff08;建议通过标题目录学习&#xff09; 废话不多…

dfs(深度优先)——太抽象了

1. 两种方法 #include<bits/stdc.h> using namespace std; //void dfs(int index,int n,vector<int> current) //{ // if(index>n){ // for(int i0;i<current.size();i){ // cout<<current[i]<<" "; // } // cout<<endl;…

python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img cv2.imread(r"C:\Users\123\…

redis解决缓存穿透/击穿/雪崩

文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩&#xff1f;2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿&#xff1f;3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

《TCP/IP网络编程》学习笔记 | Chapter 22:重叠 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型理解重叠 I/O 模型重叠 I/O本章讨论的重叠 I/O 的重点不在于 I/O 创建重叠 I/O 套接字执行重叠 I/O 的 WSASend 函数进行重叠 I/O 的 WSA…

python每日十题(10)

在Python语言中&#xff0c;源文件的扩展名&#xff08;后缀名&#xff09;一般使用.py。 保留字&#xff0c;也称关键字&#xff0c;是指被编程语言内部定义并保留使用的标识符。Python 3.x有35个关键字&#xff0c;分别为&#xff1a;and&#xff0c;as&#xff0c;assert&am…

LabVIEW液压振动锤控制系统

在现代工程机械领域&#xff0c;液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件&#xff0c;展开液压振动锤启停共振控制技术的研究与应用&#xff0c;探讨如何通过改进控制系统来优化液压振动锤的工作性能&#xff0c;确保其在复杂工况下的稳定性与效率。 ​ …

简单介绍My—Batis

1.什么是My—Batis&#xff1f; My—Batis是一个持久层框架&#xff0c;提供了sql映射功能&#xff0c;能方便的将数据库表和java对象进行映射&#xff0c;通过My—Batis可以将项目中的数据存储在数据库中&#xff0c;以便我们进行调用。值得注意的是My—Batis和spring不是一回…

ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景

以下是 ‌Oracle 数据库‌中三个收缩表空间命令的对比&#xff1a; 1. ALTER TABLE table_name SHRINK SPACE;‌ ‌作用‌&#xff1a;直接重组表数据并移动高水位线&#xff08;HWM&#xff09;&#xff0c;释放未使用的空间到表空间‌。 影响‌&#xff1a; 会锁表&#…

docker远程debug

1. 修改 Java 启动命令 在 Docker 容器中启动 Java 程序时&#xff0c;需要添加 JVM 调试参数&#xff0c;jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本&#xff1a; java -Xdebug -Xrunjdwp:tra…

rosbag|ROS中.bag数据包转换为matlab中.mat数据类型

代码见代码 msg_dict中设置自定义消息类型 test_config中设置需要记录的具体的值 test_config中topic_name以及message_type照搬plotjuggler打开时的参数 最后生成.mat文件在matlab中进行使用

pytest-xdist 进行高效并行自动化测试

pytest-xdist 的核心功能是通过多进程分发测试任务&#xff0c;每个进程独立运行测试&#xff0c;确保测试隔离。2025 年 3 月 25 日&#xff0c;pytest-xdist 在 GitHub 上已有超过 1,200,000 次下载&#xff0c;表明其在测试社区中的广泛接受。 在自动化测试中&#xff0c;随…

位置编码再思考

最近在做多模态&#xff0c;发现基于 transformer 的多模态&#xff0c;position embedding 是一个非常重要的内容&#xff0c;而且还没有统一方案&#xff0c;先暂做记录&#xff0c;几篇还不错的博客&#xff1a; Transformer学习笔记一&#xff1a;Positional Encoding&…

Deepseek API+Python 测试用例一键生成与导出 V1.0.3

** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…

[c语言日寄MAX]深度解析:大小端字节序

【作者主页】siy2333 【专栏介绍】⌈c语言日寄MAX⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还…

Android ADB工具使用教程(从安装到使用)

目录 ADB工具介绍 什么是ADB&#xff1f; 组成 主要功能 ADB工具安装与连接设备 WIFI连接&#xff0c;提示计算机积极拒绝10061 WIFI成功连接后&#xff0c;拔掉数据线显示offline 提示adb版本不一致​编辑 ADB工具使用 ★日志操作命令 adb logcat:抓取日志 日志格式…