动态 url - Feign 客户端

问题描述 投票:0回答:1

我需要向一个我从一开始就不确定的端点发出发布请求,并且只有在我收到有效负载之后才知道:

messageBody.getCallbackUri()

你知道java spring中的解决方案吗,因为我尝试使用fiegn客户端,但它需要一个基本url,但我需要根据我收到的有效负载设置该url:

@Slf4j
@Service
@RequiredArgsConstructor
public class NotifyService {

  private final FClient fClient;

  public void notify(
      String postPayload, OrderDto messageBody, int numberOfAttempts) {
    log.info(
        "Posting payload "
            + postRequestPayload
            + "to"
            + messageBody.getCallbackUri()
            + "..."
            + "attempting "
            + numberOfAttempts
            + " times");
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (int i = 1; i <= numberOfAttempts; i++) {
      try {
        log.info("Trying Post request, attempt number-" + i);
        ResponseEntity<String> response =
            fClient.postCallback(messageBody.getUri(), postPayload, headers);
        log.info("Attempt " + i + ": Response code: " + response.getStatusCodeValue());

        if (response.getStatusCode().is2xxSuccessful()) {
          break; // Break the loop if successful response
        }
      } catch (RestClientException restClientException) {
        log.error("Post request unsuccessfully", restClientException);
      }
    }
  }
}

@FeignClient(name = "Client", url = "your-service-url")
interface FClient {

  @PostMapping
  ResponseEntity<String> postCallback(
      @RequestParam("Uri") String callbackUri,
      @RequestBody String postPayload,
      @RequestHeader HttpHeaders headers)
}

看到 url 附加了 your-service-url,但我只需要向 messageBody.getUri() 发帖

谢谢

java spring spring-mvc resttemplate feign
1个回答
0
投票

您可以使用名为“forest”的框架 你可以在maven仓库中搜索它。 例如

<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot-starter</artifactId>
    <version>1.5.28</version>
</dependency>

此链接上的文档 https://forest.dtflyx.com/

您可以使用以下代码作为演示

/
** 
 * 若全局变量中已定义 baseUrl 和 accept,
 * 便会将全局变量中的值绑定到 @BaseRequest 的属性中
 */
@BaseRequest(
    baseURL = "${baseUrl}",     // 默认域名
    headers = {
        "Accept:${accept}"      // 默认请求头
    }
)
public interface MyClient {

    // 方法的URL的域名将会引用全局变量中定义的 baseUrl
    @Get("{url1}")     
    String send1(@Query("url1") String username),@Query("username") String username);

 
}
© www.soinside.com 2019 - 2024. All rights reserved.