【问题标题】:Feign - URL encode path paramsFeign - URL 编码路径参数
【发布时间】:2017-05-10 09:57:47
【问题描述】:

这是我的合同,

@RequestLine("GET /products/{id}")
@Headers({"Content-Type: application/json"})
ApiResponse getProduct(@Param("id") String productId) throws Exception;

我想获取 id = "a/b" 的产品,

如果我将此作为参数发送给getProduct("a/b")

然后形成的 URL 是 http://api/products/a/b,我得到一个 404 而不是 url 应该是 http://api/products/a%2Fb

有没有办法解决这个问题?

【问题讨论】:

  • 我正在使用 io.github.openfeignfeign-core9.5.0

标签: spring-boot netflix-feign feign


【解决方案1】:

一个简单的配置就做到了,

@RequestLine(value = "GET /products/{id}", decodeSlash = false)
@Headers({"Content-Type: application/json"})
ApiResponse getProduct(@Param("id") String productId) throws Exception;

路径参数已正确编码,但 RequestTemplate 在发送导致问题的请求之前再次解码 URL(默认为 decodeSlash=true)。

【讨论】:

  • 我发现了同样的问题。恕我直言,它应该是默认行为:/如果我传递路径参数,它应该从现在开始简单编码直到结束......:/无论如何感谢您展示解决方案
  • 谢谢,这引导我朝着正确的方向前进。在我的例子中,FeignClient 是由 openapi-generator 生成的,所以我无法立即更改它,但我必须调整模板。在这里查看我的答案:stackoverflow.com/a/58712381/1326662
【解决方案2】:

在我的例子中,当代码看起来像这样时:

@GetMapping(path = "/document/{documentId}/files/{fileId}")
  ResponseEntity<byte[]> getDocument(@PathVariable("documentId") String documentId, @PathVariable(value = "fileId") String fileId);

还有一个问题是@PathVariable fileId 可能是123/SGINED。

设置 application.property feign.client.decodeSlash=false 有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多