android - Retrofit2 奇怪的组合不同大括号前面的request Body
问题描述
我正在使用Retrofit2,但我遇到了这个问题。我为body写了简单的实体:
data class DateRequest(
@JsonAdapter(RetrofitDateSerializer::class)
@SerializedName("date") @Expose val date: OffsetDateTime)
我还为它编写了自定义序列化程序:
class RetrofitDateSerializer : JsonSerializer<OffsetDateTime> {
override fun serialize(
srcDate: OffsetDateTime?,
typeOfSrc: Type?,
context: JsonSerializationContext?
): JsonElement? {
val formatted = DateTimeUtil.convertFromDateTime(srcDate!!)
return JsonPrimitive(formatted)
}}
日期时间实用程序:
fun convertFromDateTime(dateTime: OffsetDateTime): String {
val formatter = formatDateTime()
return formatter.format(dateTime)
}
fun formatDateTime(): DateTimeFormatter {
return DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withLocale(Locale.US)
}
并在请求正文中以某种方式出现:
)]}'{"date": "2018-12-07 06:00:00"}
这个“ )]}' ”如何附加在请求中我的“日期”json前面?
@POST("changecleaning/{userId}/{cleaningId}/{status}")
fun changeCleaning(
@Path("userId") userId: Long,
@Path("cleaningId") cleaningId: Long,
@Path("status") status: Int,
@Body date: DateRequest
): Maybe<Status>
我发现只有在JsonWriter在buffer.readByteString()中做了一些魔术之后,它存储了破碎的身体。
GsonRequestBodyConverter:
@Override public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
JsonWriter jsonWriter = gson.newJsonWriter(writer);
adapter.write(jsonWriter, value);
jsonWriter.close();
return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
}
解决方案
我发现问题出在哪里:
这是我的自定义GsonBuilder:
private fun getGsonFactory(): Gson {
return GsonBuilder()
.setLenient()
.serializeSpecialFloatingPointValues()
.setLongSerializationPolicy(LongSerializationPolicy.DEFAULT)
.generateNonExecutableJson()
.enableComplexMapKeySerialization()
.serializeNulls()
.setPrettyPrinting()
.registerTypeAdapter(CleaningProgress::class.java, CleaningProgressDeserializer())
.create()
}
下面的代码行,在请求前面添加“ )]}' ”。为什么我将它添加到构建器?我相信有关此方法的官方文档:
通过在生成的 JSON 前面加上一些特殊文本,使输出 JSON 在 Javascript 中不可执行。这可以防止来自第三方站点通过脚本来源的攻击。
.generateNonExecutableJson()
现在我的GsonBuilder看起来像这样:
private fun getGsonFactory(): Gson {
return GsonBuilder()
.serializeNulls()
.registerTypeAdapter(CleaningProgress::class.java, CleaningProgressDeserializer())
.create()
}
推荐阅读
- angular - 如何在开发过程中使用 ng serve 服务于不同的 Angular 语言环境?
- google-chrome - 使用 JavaScript 从选定文本中获取 HTML 内容
- python - BeautifulSoup extract p, heading, li
- c# - Autofac为task方法实现AOP缓存报错
- powershell - 为什么不调用这个 Pester 3.4 Mock?
- php - Symfony 5 更新后 Laravel 7 电子邮件异常中断
- c# - 更改 IStringLocalizer 的语言
- python - 如何插入小数。Sqlite 表中的 ex(12.5$)
- ios - 如何以编程方式将触摸事件添加到我的 UIView 对象?
- c# - 如何在模型到模型中使用 jquery 发送数据和图像。?