Maison  >  Article  >  Java  >  Comment SpringBoot transmet-il les paramètres de l'en-tête via des appels Feign ?

Comment SpringBoot transmet-il les paramètres de l'en-tête via des appels Feign ?

PHPz
PHPzavant
2023-05-16 20:38:072537parcourir

[SpringBoot] Passage des paramètres dans l'en-tête via les appels Feign

Comment transmettre les paramètres de l'en-tête via Feign

Description du problème

Lorsque nous utilisons Feign pour demander l'interface API d'un autre service dans SpringCloud, il est nécessaire de transmettre les paramètres dans l’en-tête Si aucun traitement spécial n’est effectué, les paramètres de l’en-tête seront perdus.

Solution

Option 1 : Passer @RequestHeader(name = "headerName")

Par exemple : Feign est défini comme suit

@FeignClient(name = "service-name")
public interface XXXFeignClient {
    @RequestMapping(value = "/user/getUserTicket", method = RequestMethod.GET)
    String getUserTicket(@RequestParam("id") String id);
}

Supposons que l'interface /user/getUserTicket dans le service nom-service doit obtenir le référent à partir des données d'en-tête, nous pouvons alors transformer le code ci-dessus :

@FeignClient(name = "service-name")
public interface XXXFeignClient {
    @RequestMapping(value = "/user/getUserTicket", method = RequestMethod.GET)
    String getUserTicket(@RequestParam("id") String id, @RequestHeader(name = "Referer") String referer);
}

Ensuite, transmettez simplement le paramètre referer lors de l'appel, tel que

public String getTicketById(@RequestParam("id") String id, HttpServletRequest request) {
        String referer = request.getHeader("Referer");
        return xxxFeignClient.getUserTicket(id, referer);
    }

Solution 2 : en implémentant l'interface RequestInterceptor

Tout d'abord, personnalisez la méthode apply qui implémente le Interface RequestInterceptor , comme suit

import org.springframework.stereotype.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
@Configuration
public class FeignConfiguration implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                requestTemplate.header(name, values);
            }
        }
    }
}

Ensuite, configurez la classe de configuration personnalisée dans Feign pour réaliser le transfert des paramètres d'en-tête de l'interface dans Feign

@FeignClient(value = "service-name" ,configuration = FeignConfiguration.class)
    public interface XXXFeignClient {
    }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer