使用 Dropwizard Jersey Client 和 Jackson 的 PUT 请求出现格式错误的 UTF-8 错误
Malformed UTF-8 error on PUT request with Dropwizard Jersey Client and Jackson
我有一个 Dropwizard 应用程序,它使用 Jersey 客户端查询外部 REST API 并将数据映射到 Jackson。 GET 请求工作正常(包括对象映射),但 PUT 请求失败并出现错误 500,当我检查 REST API 服务器日志时,它显示以下内容:
2022-02-09T11:00:34 [F|app|bd4d2aec]
bd4d2aec | JSON::GeneratorError (source sequence is illegal/malformed utf-8):
bd4d2aec |
bd4d2aec | lib/server/middleware/catch_json_parse_errors.rb:16:in `rescue in call'
bd4d2aec | lib/server/middleware/catch_json_parse_errors.rb:8:in `call'
bd4d2aec | lib/server/middleware/logging_context_session.rb:22:in `call'
bd4d2aec | lib/server/middleware/logging_context_request.rb:11:in `call'
请求正文JSON所需代码为:
{"hostgroup": {"description": "Test"}}
我用常规 api 客户端测试了它并且它有效。这就是我将它翻译成 Kotlin 对象的方式:
data class UpdateHostgroupInput(val hostgroup: UpdateDescriptionInput)
data class UpdateDescriptionInput(val description: String?)
这就是我构建客户端和请求的方式:
val client = JerseyClientBuilder(environment)
.using(configuration.APIServerConfiguration.client)
.using(environment.objectMapper).build("API-client")
.target(url)
.register(HttpAuthenticationFeature.basic(user, password))
val parameter = UpdateHostgroupInput(UpdateDescriptionInput("Test"))
client.path(endpoint).request(MediaType.APPLICATION_JSON_TYPE).put(Entity.json(parameter))
我试图明确声明 UTF-8 编码,但它似乎是 Jackson 的默认编码。我也尝试忘记对象并直接将 JSON 写为 UTF-8 编码的字符串,但结果是一样的。我已经放弃了 API 本身的故障,因为我能够成功地从 Python 执行相同的请求。
关于我在这里做错了什么的任何提示?感谢您的帮助。
我通过在配置文件 (yml) 中禁用 Jersey 客户端中的 gzip 解决了这个问题:
jerseyClient:
gzipEnabled: false
我猜它与我正在查询的服务器不兼容。
我有一个 Dropwizard 应用程序,它使用 Jersey 客户端查询外部 REST API 并将数据映射到 Jackson。 GET 请求工作正常(包括对象映射),但 PUT 请求失败并出现错误 500,当我检查 REST API 服务器日志时,它显示以下内容:
2022-02-09T11:00:34 [F|app|bd4d2aec]
bd4d2aec | JSON::GeneratorError (source sequence is illegal/malformed utf-8):
bd4d2aec |
bd4d2aec | lib/server/middleware/catch_json_parse_errors.rb:16:in `rescue in call'
bd4d2aec | lib/server/middleware/catch_json_parse_errors.rb:8:in `call'
bd4d2aec | lib/server/middleware/logging_context_session.rb:22:in `call'
bd4d2aec | lib/server/middleware/logging_context_request.rb:11:in `call'
请求正文JSON所需代码为:
{"hostgroup": {"description": "Test"}}
我用常规 api 客户端测试了它并且它有效。这就是我将它翻译成 Kotlin 对象的方式:
data class UpdateHostgroupInput(val hostgroup: UpdateDescriptionInput)
data class UpdateDescriptionInput(val description: String?)
这就是我构建客户端和请求的方式:
val client = JerseyClientBuilder(environment)
.using(configuration.APIServerConfiguration.client)
.using(environment.objectMapper).build("API-client")
.target(url)
.register(HttpAuthenticationFeature.basic(user, password))
val parameter = UpdateHostgroupInput(UpdateDescriptionInput("Test"))
client.path(endpoint).request(MediaType.APPLICATION_JSON_TYPE).put(Entity.json(parameter))
我试图明确声明 UTF-8 编码,但它似乎是 Jackson 的默认编码。我也尝试忘记对象并直接将 JSON 写为 UTF-8 编码的字符串,但结果是一样的。我已经放弃了 API 本身的故障,因为我能够成功地从 Python 执行相同的请求。
关于我在这里做错了什么的任何提示?感谢您的帮助。
我通过在配置文件 (yml) 中禁用 Jersey 客户端中的 gzip 解决了这个问题:
jerseyClient:
gzipEnabled: false
我猜它与我正在查询的服务器不兼容。