web-dev-qa-db-ja.com

ランタイム中に偽のURLを変更するにはどうすればよいですか?

@FeignClient(name = "test", url="http://xxxx")

ランタイム中に偽のURL(url = "http:// xxxx")を変更するにはどうすればよいですか? URLは実行時にのみ決定できるためです。

10
liucyu

Feignには、実行時に動的URLとエンドポイントを提供する方法があります。

次の手順に従う必要があります。

  1. FeignClientインターフェイスでは、URLパラメータを削除する必要があります。 RESTメソッド(GET、PUT、POSTなど))について言及するには、@RequestLineアノテーションを使用する必要があります。
@FeignClient(name="customerProfileAdapter")
public interface CustomerProfileAdaptor {

    // @RequestMapping(method=RequestMethod.GET, value="/get_all")
    @RequestLine("GET")
    public List<Customer> getAllCustomers(URI baseUri); 

    // @RequestMapping(method=RequestMethod.POST, value="/add")
    @RequestLine("POST")
    public ResponseEntity<CustomerProfileResponse> addCustomer(URI baseUri, Customer customer);

    @RequestLine("DELETE")
    public ResponseEntity<CustomerProfileResponse> deleteCustomer(URI baseUri, String mobile);
}
  1. RestControllerでは、FeignClientConfigurationをインポートする必要があります
  2. エンコーダーとデコーダーをパラメーターとして1つのRestControllerコンストラクターを記述する必要があります。
  3. エンコーダーとデコーダーでFeignClientをビルドする必要があります。
  4. FeignClientメソッドを呼び出すときに、URI(BaserUrl +エンドポイント)と、残りの呼び出しパラメーターがあれば、それを指定します。
@RestController
@Import(FeignClientsConfiguration.class)
public class FeignDemoController {

    CustomerProfileAdaptor customerProfileAdaptor;

    @Autowired
    public FeignDemoController(Decoder decoder, Encoder encoder) {
        customerProfileAdaptor = Feign.builder().encoder(encoder).decoder(decoder) 
           .target(Target.EmptyTarget.create(CustomerProfileAdaptor.class));
    }

    @RequestMapping(value = "/get_all", method = RequestMethod.GET)
    public List<Customer> getAllCustomers() throws URISyntaxException {
        return customerProfileAdaptor
            .getAllCustomers(new URI("http://localhost:8090/customer-profile/get_all"));
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public ResponseEntity<CustomerProfileResponse> addCustomer(@RequestBody Customer customer) 
            throws URISyntaxException {
        return customerProfileAdaptor
            .addCustomer(new URI("http://localhost:8090/customer-profile/add"), customer);
    }

    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    public ResponseEntity<CustomerProfileResponse> deleteCustomer(@RequestBody String mobile)
            throws URISyntaxException {
        return customerProfileAdaptor
            .deleteCustomer(new URI("http://localhost:8090/customer-profile/delete"), mobile);
    }
}
15
Sandip Nirmal

注釈なしのURIパラメーター(実行時に決定される可能性がある)を追加できます。これは、要求に使用されるベースパスになります。例えば。:

@FeignClient(name = "dummy-name", url = "https://this-is-a-placeholder.com")
public interface MyClient {
    @PostMapping(path = "/create")
    UserDto createUser(URI baseUrl, @RequestBody UserDto userDto);
}

そして使用法は次のようになります:

@Autowired 
private MyClient myClient;
...
URI determinedBasePathUri = URI.create("https://my-determined-Host.com");
myClient.createUser(determinedBasePathUri, userDto);

これにより、POSTリクエストがhttps://my-determined-Host.com/createsource )に送信されます。

8
asherbar

クライアントは手動で作成できます。

@Import(FeignClientsConfiguration.class)
class FooController {

    private FooClient fooClient;

    private FooClient adminClient;

    @Autowired
    public FooController(ResponseEntityDecoder decoder, SpringEncoder encoder, Client client) {
        this.fooClient = Feign.builder().client(client)
            .encoder(encoder)
            .decoder(decoder)
            .requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
            .target(FooClient.class, "http://PROD-SVC");
        this.adminClient = Feign.builder().client(client)
            .encoder(encoder)
            .decoder(decoder)
            .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
            .target(FooClient.class, "http://PROD-SVC");
     }
}

ドキュメントを参照してください: https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#_creating_feign_clients_manually

3
Jeff

複数のプロファイルに依存するスプリングを使用するかどうかはわかりません。例:like(dev、beta、prodなど)

異なるymlまたはプロパティに依存している場合。 FeignClientlike:(@FeignClient(url = "${feign.client.url.TestUrl}", configuration = FeignConf.class))を定義できます

その後

定義する

feign:
  client:
    url:
      TestUrl: http://dev:dev

application-dev.yml

定義する

feign:
  client:
    url:
      TestUrl: http://beta:beta

application-beta.yml内(私はymlを好みます)。

…….

神に感謝。

2
Forest10

インターフェースでは、SpringアノテーションでURLを変更できます。ベースURIはyml Spring構成で構成されます。

   @FeignClient(
            name = "some.client",
            url = "${some.serviceUrl:}",
            configuration = FeignClientConfiguration.class
    )

public interface SomeClient {

    @GetMapping("/metadata/search")
    String search(@RequestBody SearchCriteria criteria);

    @GetMapping("/files/{id}")
    StreamingResponseBody downloadFileById(@PathVariable("id") UUID id);

}
1