You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Retrofit更新数据时服务器出现额外斜杠与引号问题求助

问题分析与解决方案

核心问题

PUT请求传递字符串"open"时,服务器端最终存储为"\"open\"",原因是Android端通过Moshi将String类型的@Body参数序列化为JSON格式字符串(自动添加双引号),而服务器端直接将该JSON字符串作为普通文本存储。

POST请求正常是因为POST通常传递实体对象,Moshi会将对象序列化为JSON对象(如{"close":"open"}),服务器端解析后能正确提取字段值;但PUT直接传String时,Moshi会把字符串本身转成JSON的字符串表示(即"\"open\"")。

解决方案

方案一:Android端传递纯文本(推荐)

修改Retrofit Service接口,改用RequestBody传递纯文本,避免Moshi的JSON序列化:

// 修正后的Service类方法
@PUT("/posts/close/update/{id}")
fun updateClose(@Path("id") id: Long, @Body close: RequestBody): Call<ResponseBody>

调用时构造纯文本RequestBody:

onClick = {
  val moshi = Moshi.Builder()
          .add(KotlinJsonAdapterFactory())
          .build()

  val retrofit = Retrofit.Builder()
          .baseUrl("https://*****.com")
          .addConverterFactory(MoshiConverterFactory.create(moshi))
          .build()

    thread {
        try {
            val service: PostService = retrofit.create(PostService::class.java)
            // 构造纯文本请求体
            val plainTextBody = RequestBody.create(MediaType.get("text/plain"), "open")
            service.updateClose(6, plainTextBody)
                .enqueue(object : Callback<ResponseBody> {
                    override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                        Log.d("Response is", "${response.body()}")
                    }

                    override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                        Log.d("Hi", "error")
                    }
                })
        } catch (e: Exception) {
            Log.d("response-weather", "debug $e")
        }
    }
}

这样传递的是原始字符串"open",服务器端接收后可直接存储。

方案二:服务器端解析JSON字符串

若无法修改Android端代码,可在Spring Boot的Controller层对接收的字符串做JSON解析,去掉外层引号:

// 示例Controller方法(根据实际代码调整)
@PutMapping("/posts/close/update/{id}")
@Transactional
public void updateClose(@PathVariable Long id, @RequestBody String close) {
    // 使用Jackson解析JSON字符串,得到实际值
    String actualClose = new ObjectMapper().readValue(close, String.class);
    postRepository.updateClose(id, actualClose);
}

此方法依赖Spring Boot默认集成的Jackson,但本质是弥补Android端的序列化问题,优先推荐方案一。


内容的提问来源于stack exchange,提问作者Yuki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:55:18