Red de conocimiento informático - Aprendizaje de programación - Registro de pozo falso: error de análisis JSON

Registro de pozo falso: error de análisis JSON

1. Rastree la pila donde se lanzó la excepción y descubrió que se lanzó una excepción durante el proceso de análisis json del resultado devuelto

2. ¿Por qué falla el análisis json? ¿Por qué falla el análisis de json? Es normal que llamemos solo a la interfaz correspondiente de Feign, y json se puede analizar normalmente

3. Ya sea que Feign haya procesado el contenido devuelto y siga el proceso de fegin, Descubrí que no hay excepciones en la respuesta a la secuencia, ¿podría provenir de la fuente? Pero no hay ninguna anomalía en la fuente. En este momento, la idea es confusa. Intenté buscar problemas relacionados en Google. Inesperadamente, encontré problemas similares en feign github /OpenFeign/feign/issues/934. p > 4. Se ha descubierto el problema, es decir, el contenido de la respuesta está codificado por gzip y el cliente predeterminado fingido no admite la decodificación gzip. Por lo tanto, aquí rastreamos el código fuente de fingir para ver el procesamiento, comenzando desde la entrada SynchronousMethodHandler, obteniendo el contenido de la respuesta en la línea 122

Finalmente, encontramos la lectura del flujo de respuesta en la línea 102 del logger El proceso de lectura es el siguiente:

5. Al final, el problema radica en la HttpURLConnection predeterminada utilizada por feign. HttpURLConnection y no se procesa de ninguna manera, lo que da como resultado la lectura del contenido comprimido con gzip. En este punto, podemos reemplazarlo con Httpclient, y su método de procesamiento interno ResponseContentEncoding eliminará Content-Encoding y determinará que no es un valor nulo, y luego obtendrá el método de procesamiento correspondiente.

La afirmación anterior acerca de que el cliente predeterminado no admite la decodificación gzip puede ser ambigua, pero el cliente predeterminado no admite el análisis de flujos de bytes comprimidos gzip, por lo que se producirán problemas de análisis al serializar en objetos. Si desea recibir, puede usar ResponseEntity para recibir, de modo que fingir no lo deserialice. Para conocer la configuración de feign.compression.request.enabled=true y feign.compression.response.compression.request.enabled=true, consulte a continuación. enable=true Configure el contenido en FeignAcceptGzipEncodingInterceptor, FeignContentGzipEncodingInterceptor, puede ver aproximadamente que solo agrega un encabezado al encabezado de la solicitud

2020/3/13

Spring ha agregado soporte, The SpringCloud La versión se puede actualizar a Hoxton

/ spring-cloud/spring-cloud-openfeign/pull/230

2020/12/01

Para problemas que aún existe Para los socios, puede usar OkHttp directamente para configurar el cliente para fingir (porque okhttp admite la compresión gzip de forma predeterminada) sin prestar atención a la versión de Spring Cloud, la solución más simple es también la más recomendada;