Feign 클라이언트 + Spring Cloud(Brixton RC2)에서 동적 값을 가진 @Headers 사용
동적 값을 헤더로 설정할 수 있습니까?
@FeignClient(name="Simple-Gateway")
interface GatewayClient {
@Headers("X-Auth-Token: {token}")
@RequestMapping(method = RequestMethod.GET, value = "/gateway/test")
String getSessionId(@Param("token") String token);
}
요청 구현 등록인터셉트에서 헤더를 추가하지만 헤더 값을 동적으로 설정할 수 있는 방법이 없습니다.
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
template.header("X-Auth-Token", "some_token");
}
};
}
나는 github에서 다음 문제를 발견했고 논평자 중 한 명(lpborges)이 에서 헤더를 사용하여 비슷한 것을 하려고 했습니다.@RequestMapping
주석
https://github.com/spring-cloud/spring-cloud-netflix/issues/288
안부의 말
해결책은 @Request를 사용하는 것입니다.특정 주석을 가장하는 대신 머리글 주석
@FeignClient(name="Simple-Gateway")
interface GatewayClient {
@RequestMapping(method = RequestMethod.GET, value = "/gateway/test")
String getSessionId(@RequestHeader("X-Auth-Token") String token);
}
@Request헤더가 작동하지 않았습니다.효과는 다음과 같습니다.
@Headers("X-Auth-Token: {access_token}")
@RequestLine("GET /orders/{id}")
Order get(@Param("id") String id, @Param("access_token") String accessToken);
@HeaderMap,@Header와 @Param은 나를 위해 작동하지 않았습니다. 아래는 @Request를 사용하기 위한 솔루션입니다.FeignClient를 사용하여 전달할 여러 헤더 매개 변수가 있는 경우 헤더
@PostMapping("/api/channelUpdate")
EmployeeDTO updateRecord(
@RequestHeader Map<String, String> headerMap,
@RequestBody RequestDTO request);
프록시를 호출하는 코드는 다음과 같습니다.
Map<String, String> headers = new HashMap<>();
headers.put("channelID", "NET");
headers.put("msgUID", "1234567889");
ResponseDTO response = proxy.updateRecord(headers,requestDTO.getTxnRequest());
이 예제를 가지고 있으며 @Request 대신 @HeaderParam을 사용합니다.머리글:
import rx.Single;
import javax.ws.rs.Consumes;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
@Consumes(MediaType.APPLICATION_JSON)
public interface FeignRepository {
@POST
@Path("/Vehicles")
Single<CarAddResponse> add(@HeaderParam(HttpHeaders.AUTHORIZATION) String authorizationHeader, VehicleDto vehicleDto);
}
HttpHeaders를 사용할 수 있습니다.
@PostMapping(path = "${path}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<?> callService(@RequestHeader HttpHeaders headers, @RequestBody Object object);
private HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "1234");
headers.add("CLIENT_IT", "dummy");
return headers;
}
당신이 오픈페이크로 작업한다면 매우 편리할 것 같아서 사용합니다.이 방법을 사용하면 헤더 키와 값을 동적으로 전달할 수 있습니다.
@Headers({"Content-Type: application/json"})
public interface NotificationClient {
@RequestLine("POST")
String notify(URI uri, @HeaderMap Map<String, Object> headers, NotificationBody body);
}
이제 서비스 끝점을 호출할 가짜 REST 클라이언트를 만들고 헤더 속성 맵을 만든 다음 메서드 매개 변수에 전달합니다.
NotificationClient notificationClient = Feign.builder()
.encoder(new JacksonEncoder())
.decoder(customDecoder())
.target(Target.EmptyTarget.create(NotificationClient.class));
Map<String, Object> headers = new HashMap<>();
headers.put("x-api-key", "x-api-value");
ResponseEntity<String> response = notificationClient.notify(new URI("https://stackoverflow.com/example"), headers, new NotificationBody());
여기서 게임에 약간 늦은 감이 있지만, 강제적이고 템플릿화된 값이 필요하다면, 저는 이것이 스프링 부트에서 작동한다는 것을 발견했습니다.보아하니, 그것이 있는 한.toString()
유효한 헤더 값을 제공하므로 모든 유형을 사용할 수 있습니다.
@FeignClient(
name = "my-feign-client",
url = "http://my-url.com"
)
public interface MyClient {
@GetMapping(
path = "/the/endpoint",
produces = MediaType.APPLICATION_JSON_VALUE
)
DataResponse getData(@RequestHeader(HttpHeaders.AUTHORIZATION) BearerHeader bearerHeader);
final class BearerHeader {
private final String token;
private BearerHeader(String token) {
this.token = token;
}
@Override
public String toString() {
return String.format("Bearer %s", token);
}
public static BearerHeader of(String token) {
return new BearerHeader(token);
}
}
언급URL : https://stackoverflow.com/questions/37066331/using-headers-with-dynamic-values-in-feign-client-spring-cloud-brixton-rc2
'source' 카테고리의 다른 글
java.lang을 가져오는 중입니다.ClassNotFoundException: javax.servlet입니다.Junit의 서블릿 컨텍스트 (0) | 2023.08.20 |
---|---|
잘못된 레일 교차 출발지 요청 (0) | 2023.08.15 |
요청에 대한 응답이 수신되지 않으면 어떻게 됩니까?재시도가 보입니다. (0) | 2023.08.15 |
연결이 로컬 호스트인지 자바스크립트로 확인하는 방법은 무엇입니까? (0) | 2023.08.15 |
이 바둑 코드에서 SQL 구문 오류 1064가 발생하는 원인은 무엇입니까? (0) | 2023.08.15 |