使用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
相关产品推荐
相关产品推荐

