0

0

在Android Retrofit中发送包含HTML标签的JSON字符串请求

霞舞

霞舞

发布时间:2025-11-17 11:38:10

|

774人浏览过

|

来源于php中文网

原创

在android retrofit中发送包含html标签的json字符串请求

本教程详细阐述了如何在Android应用中使用Retrofit框架发送包含HTML标签的JSON字符串作为请求体。核心在于利用Retrofit的JSON转换器(如Gson)自动处理字符串序列化,无需特殊编码,确保HTML内容能作为标准的JSON字符串安全地传输到服务器。文章将涵盖数据模型定义、Retrofit接口配置及实际调用示例。

在Android开发中,通过Retrofit向后端API发送数据是常见的操作。有时,我们需要在JSON请求体中包含HTML标签作为字符串内容,例如富文本编辑器生成的HTML片段。许多开发者可能会认为这需要特殊的编码处理,但实际上,Retrofit配合合适的JSON转换器(如Gson或Moshi)能够非常优雅地处理这种情况,将HTML字符串视为普通字符串进行序列化。

1. 理解核心机制:JSON字符串与HTML内容

JSON(JavaScript Object Notation)规范明确指出,字符串值可以包含任何Unicode字符,除了双引号、反斜杠以及一些控制字符(如换行符、回车符、制表符等),这些特殊字符需要通过反斜杠进行转义。HTML标签本身(如

, )并不属于JSON需要特殊转义的字符范畴。因此,当我们将一个包含HTML标签的Java/Kotlin String 对象传递给Retrofit时,JSON转换器会将其原样序列化为JSON字符串,并在必要时对内部的JSON特殊字符进行转义。

例如,一个Java/Kotlin字符串 "

Hello World!

立即学习前端免费学习笔记(深入)”;

" 经过JSON序列化后,在JSON请求体中会呈现为 "

Hello World!

"。如果字符串中包含双引号,如 "Link",则会序列化为 "Link",这是JSON标准转义行为,与HTML本身无关。

2. Retrofit环境配置

首先,确保你的项目中已添加Retrofit及其JSON转换器依赖。这里以Gson为例:

// build.gradle (app module)
dependencies {
    // Retrofit core
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    // Gson converter for Retrofit
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    // OkHttp (Retrofit's underlying HTTP client)
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' // For logging requests/responses
}

3. 定义请求体的数据模型 (POJO)

为了发送结构化的JSON数据,我们需要定义一个数据类(POJO - Plain Old Java Object 或 Kotlin Data Class)来表示请求体。这个数据类中的HTML内容字段应直接定义为 String 类型。

Bolt.new
Bolt.new

Bolt.new是一个免费的AI全栈开发工具

下载

假设我们的目标JSON请求体如下:

{
  "text": "

ffsdsdf @Vendor

", "users": ["12fe9af4-e2d6-47cb-9601-64c7a1fe9c4a"] }

对应的Kotlin数据类可以这样定义:

// data/PostRequest.kt
package com.example.myapp.data

import com.google.gson.annotations.SerializedName

data class PostRequest(
    @SerializedName("text")
    val text: String,
    @SerializedName("users")
    val users: List
)

4. 创建Retrofit服务接口

定义一个Retrofit接口,其中包含用于发送POST请求的方法。使用 @POST 注解指定API路径,并使用 @Body 注解将我们定义的数据模型作为请求体发送。

// api/MyApiService.kt
package com.example.myapp.api

import com.example.myapp.data.PostRequest
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST

interface MyApiService {
    @POST("your/api/endpoint") // 替换为你的实际API端点
    suspend fun postHtmlContent(@Body request: PostRequest): Response // 假设服务器返回空响应或一个通用成功响应
}

5. 构建Retrofit实例并执行请求

在你的应用组件(如Activity、Fragment或ViewModel)中,你需要构建Retrofit实例,创建服务接口的实现,然后调用其方法来发送请求。

// client/RetrofitClient.kt
package com.example.myapp.client

import com.example.myapp.api.MyApiService
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit

object RetrofitClient {
    private const val BASE_URL = "https://your.api.base.url/" // 替换为你的API基础URL

    private val loggingInterceptor = HttpLoggingInterceptor().apply {
        level = HttpLoggingInterceptor.Level.BODY // 打印请求和响应体
    }

    private val okHttpClient = OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .connectTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .build()

    val apiService: MyApiService by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build()
            .create(MyApiService::class.java)
    }
}

现在,你可以在应用中调用 apiService 来发送请求:

// Example usage in an Activity or ViewModel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.myapp.client.RetrofitClient
import com.example.myapp.data.PostRequest
import kotlinx.coroutines.launch

class MyViewModel : ViewModel() {

    fun sendContentWithHtml() {
        viewModelScope.launch {
            val htmlContent = "

这是一个包含粗体斜体文字的HTML片段。

" + "" + "" + "@Vendor 3 company Vendor" + "" val users = listOf("12fe9af4-e2d6-47cb-9601-64c7a1fe9c4a") val requestBody = PostRequest(text = htmlContent, users = users) try { val response = RetrofitClient.apiService.postHtmlContent(requestBody) if (response.isSuccessful) { println("HTML内容发送成功!") } else { println("发送失败: ${response.code()} - ${response.errorBody()?.string()}") } } catch (e: Exception) { println("请求发生异常: ${e.message}") } } } }

6. 注意事项与总结

  1. JSON转换器的选择和配置: 确保你选择了并正确配置了JSON转换器(如GsonConverterFactory)。它是将Kotlin/Java对象转换为JSON字符串的关键。
  2. @Body 注解: 对于发送请求体,务必使用 @Body 注解,它告诉Retrofit将参数对象序列化为HTTP请求体。
  3. @EncodedPath 的误用: 原始问题中可能提到了 @EncodedPath。请注意,@EncodedPath 用于对URL路径段进行编码,例如 GET /users/{id} 中的 {id}。它不适用于请求体中的字段。在请求体中,HTML字符串会由JSON转换器作为普通字符串处理。
  4. 服务器端解析: 确保你的后端API能够正确接收并解析包含HTML标签的JSON字符串。通常,这只是一个标准的JSON解析过程,后端会获取到一个普通的字符串,其内容恰好是HTML。如果后端需要对HTML内容进行进一步处理(如存储、显示),则由后端逻辑负责。
  5. 安全性(XSS): 如果HTML内容是用户输入的,在服务器端显示或处理时,务必进行适当的HTML清理和XSS防护,以防止跨站脚本攻击。这与Retrofit的发送机制无关,但对于处理用户生成HTML的应用至关重要。
  6. TypedString (Retrofit 1.x 遗留): 如果你在旧项目中遇到 TypedString,请注意这是Retrofit 1.x 的概念,在Retrofit 2.x 中已被淘汰,不应再使用。

总结: 在Android Retrofit中发送包含HTML标签的JSON字符串请求,并不需要特殊的编码或处理。核心在于定义一个匹配JSON结构的POJO,并将HTML内容字段声明为 String 类型。Retrofit配合JSON转换器(如Gson)会负责将这些字符串正确地序列化到JSON请求体中。遵循标准的Retrofit实践即可轻松实现。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

834

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.2万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号