Feign - параметры URL-адреса кодируют путь

Это мой контракт,

@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

Есть ли способ обойти это?


person NitishDeshpande    schedule 10.05.2017    source источник
comment
Я использую ‹dependency› ‹groupId›io.github.openfeign‹/groupId› ‹artifactId›feign-core‹/artifactId› ‹version›9.5.0‹/version› ‹/dependency›   -  person NitishDeshpande    schedule 10.05.2017


Ответы (2)


Простой конфиг сделал это,

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

Параметр пути правильно кодировался, но RequestTemplate снова декодировал URL-адрес (decodeSlash=true по умолчанию) перед отправкой запроса, который вызывал проблему.

person NitishDeshpande    schedule 10.05.2017
comment
Я нашел ту же проблему. ИМХО, это должно быть поведение по умолчанию:/Если я передаю аргумент пути, он должен с этого момента просто кодироваться до конца...:/В любом случае спасибо за показ решения - person Tomasz; 23.07.2018
comment
Спасибо, это привело меня в правильном направлении. В моем случае FeignClient был сгенерирован openapi-генератором, поэтому я не мог изменить его сразу, но мне пришлось адаптировать шаблоны. См. мой ответ здесь: stackoverflow.com/a/58712381/1326662 - person Ralf; 05.11.2019

В моем случае, когда код выглядит так:

@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.

person Raba_Ababa    schedule 11.05.2021