web-dev-qa-db-fra.com

Comment puis-je changer l'URL feinte pendant l'exécution?

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

Comment puis-je changer l'URL feinte (url = "http: // xxxx") pendant l'exécution? car l'URL ne peut être déterminée qu'au moment de l'exécution.

10
liucyu

Feign a un moyen de fournir les URL dynamiques et les points de terminaison lors de l'exécution.

Les étapes suivantes doivent être suivies:

  1. Dans l'interface FeignClient, nous devons supprimer le paramètre URL. Nous devons utiliser @RequestLine annotation pour mentionner la REST (GET, PUT, POST, etc.):
@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. Dans RestController, vous devez importer FeignClientConfiguration
  2. Vous devez écrire un constructeur RestController avec l'encodeur et le décodeur comme paramètres.
  3. Vous devez construire le FeignClient avec l'encodeur, le décodeur.
  4. Lors de l'appel des méthodes FeignClient, fournissez l'URI (BaserUrl + endpoint) ainsi que les paramètres d'appel de repos, le cas échéant.
@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

Vous pouvez ajouter un paramètre URI non annoté (qui peut potentiellement être déterminé au moment de l'exécution) et qui sera le chemin de base qui sera utilisé pour la demande. Par exemple.:

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

Et puis l'utilisation sera:

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

Cela enverra une demande de POST à https://my-determined-Host.com/create ( source ).

8
asherbar

Vous pouvez créer le client manuellement:

@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");
     }
}

Veuillez consulter la documentation: https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#_creating_feign_clients_manually

3
Jeff

Je ne sais pas si vous utilisez le ressort dépend de plusieurs profils. par exemple: comme (dev, beta, prod et ainsi de suite)

si vous dépendez de différents yml ou propriétés. vous pouvez définir FeignClient comme: (@FeignClient(url = "${feign.client.url.TestUrl}", configuration = FeignConf.class))

puis

définir

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

dans votre application-dev.yml

définir

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

dans votre application-beta.yml (je préfère yml).

......

merci god.enjoy.

2
Forest10

Dans l'interface, vous pouvez modifier l'URL par des annotations Spring. L'URI de base est configuré dans la configuration 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