Удаление невидимых обратных косых черт из текста / HTML ответ от publi c API в WebFlux - PullRequest
0 голосов
/ 25 марта 2020

Я начал разрабатывать приложение на основе API publi c, которое возвращает не дружественный тип данных в формате text/HTML. Несколько конечных точек возвращают нормальные данные, не размывая их, но есть такая, которая добавляет дополнительные \ к каждому элементу в ответ.

пример ответа ниже:

"{\"country\":\"Poland\",\"stat_by_country\":[{\"id\":\"365\",\"country_name\":\"Poland\",\"total_cases\":\"238\",\"new_cases\":\"61\",\"active_cases\":\"232\",\"total_deaths\":\"5\",\"new_deaths\":\"1\",\"total_recovered\":\"1\",\"serious_critical\":\"3\",\"region\":null,\"total_cases_per1m\":\"6.3\",\"record_date\":\"2020-03-17 21:00:05.485\"}]

Мои классы-оболочки выглядят следующим образом:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
public class CountryCasesHistory {
  private String id;
  private String country_name;
  private String total_cases;
  private String new_cases;
  private String active_cases;
  private String total_deaths;
  private String new_deaths;
  private String total_recovered;
  private String serious_critical;
  private String region;
  private String total_cases_per1m;
  private String record_date;
}

и

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
public class CountryCasesHistoryWrapper {
  @JsonProperty("country")
  private String country;
  @JsonProperty("stat_by_country")
  private Set<CountryCasesHistory> statsByCountry;
}

Сервис и обработчик выглядят следующим образом :

@Service
public class Covid19APIService {

  @Value("${rapid-API-URL}")
  private String covidAPIURL;

  @Value("${x-rapidapi-host}")
  private String covidAPI;

  @Value("${x-rapidapi-key}")
  private String covidAPIKey;

  public Mono<CountryCasesHistoryWrapper> findCasesHistoryForCountry(String country) {

    return buildWebClient()
        .get()
        .uri("/cases_by_particular_country.php")
        .retrieve()
        .onStatus(
            HttpStatus::is4xxClientError,
            response -> error(new InfrastructureException("Covid19 public API not found")))
        .onStatus(
            HttpStatus::is4xxClientError,
            response -> error(new InfrastructureException("Covid19 public API server exception")))
        .bodyToMono(CountryCasesHistoryWrapper.class);
  }

  private void acceptedCodecs(ClientCodecConfigurer clientCodecConfigurer) {
    clientCodecConfigurer
        .customCodecs()
        .register(new Jackson2JsonEncoder(new ObjectMapper(), TEXT_HTML));
    clientCodecConfigurer
        .customCodecs()
        .register(new Jackson2JsonDecoder(new ObjectMapper(), TEXT_HTML));
  }
}

Обработчик. java

@Component
@RequiredArgsConstructor
public class Covid19APIHandler {

  private final Covid19APIService apiService;

  public Mono<ServerResponse> getCasesHistoryForCountry(ServerRequest serverRequest) {
    String country =
        serverRequest
            .queryParam("country")
            .orElseThrow(
                () -> new InfrastructureException("Country parameter is required for this action"));
    final Mono<CountryCasesHistoryWrapper> casesHistoryForCountry =
        apiService.findCasesHistoryForCountry(country);

    return casesHistoryForCountry
        .flatMap(
            gc ->
                ok().contentType(APPLICATION_JSON)
                    .body(fromPublisher(casesHistoryForCountry, CountryCasesHistoryWrapper.class)))
        .switchIfEmpty(noContent().build());
  }
}

Текущие решения приводят к ошибке бэкэнда:

"message": "Invalid JSON input: Unrecognized field \"error\" (class com.covid.domain.model.CountryCasesHistoryWrapper), not marked as ignorable; nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field \"error\" (class com.covid.domain.model.CountryCasesHistoryWrapper), not marked as ignorable (2 known properties: \"stat_by_country\", \"country\"])\n at [Source: (io.netty.buffer.ByteBufInputStream); line: 1, column: 11] (through reference chain: com.covid.domain.model.CountryCasesHistoryWrapper[\"error\"])"

Мой вопрос, возможно ли избавиться от отключите каждый \ из ответа и получите в результате нормальный, не размытый объект и, следовательно, ошибку обхода. Буду благодарен за предложение о том, как достичь цели.

РЕДАКТИРОВАТЬ: я могу использовать блок на Mono и переназначить значения в другой объект с помощью метода .replaceAll, но это не желательное решение. У кого-нибудь есть другое предложение?

...