Retrofit2 странная комбинация разных брекетов перед запросом Body - PullRequest
0 голосов
/ 07 декабря 2018

Я использую Retrofit2 , и я застрял в проблеме.Я написал простую сущность для тела:

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)
}}

DateTimeUtil :

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"}

Как этот ")]} '" может быть прикреплен перед моим " date " 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());

}

1 Ответ

0 голосов
/ 07 декабря 2018

Я нашел, откуда возникла проблема:

Вот мой кастом GsonBuilder :

private fun getGsonFactory(): Gson {
        return GsonBuilder()
            .setLenient()
            .serializeSpecialFloatingPointValues()
            .setLongSerializationPolicy(LongSerializationPolicy.DEFAULT)
            .generateNonExecutableJson()
            .enableComplexMapKeySerialization()
            .serializeNulls()
            .setPrettyPrinting()
            .registerTypeAdapter(CleaningProgress::class.java, CleaningProgressDeserializer())
            .create()
    }

В строке кода ниже добавьте, что ")]} ' "перед запросом.Почему я добавляю это к строителю?Я доверяю официальной документации об этом методе:

Делает выходной JSON неисполняемым в Javascript, добавляя префикс сгенерированного JSON к некоторому специальному тексту.Это предотвращает атаки со сторонних сайтов с помощью сценариев.

.generateNonExecutableJson()

Теперь мой GsonBuilder выглядит следующим образом:

private fun getGsonFactory(): Gson {
    return GsonBuilder()
        .serializeNulls()
        .registerTypeAdapter(CleaningProgress::class.java, CleaningProgressDeserializer())
        .create()
}
...