У меня есть приложение Spring, которое имеет несколько служб, взаимодействующих через REST.Представьте себе простой
@RestController
, который внутренне вызывает другую конечную точку покоя.
Когда служба A вызывает службу B , вызывается httpRequest spring, например, [POST] / api / test / serviceb,Есть ли способ получить родительский URL / конечную точку такого запроса?Я хотел бы знать в Службе B, кто это называет.Как я могу получить эту информацию в Spring?
Я написал Interceptor, который перехватывает каждый оставшийся вызов, но не знает, как получить родительский URL для каждого сделанного вызова.
public class AuditRestInterceptor implements ClientHttpRequestInterceptor{
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution exec)
throws IOException {
// TODO any way to find out who call it ?
}
}
Редактировать: Iпереписать мой перехватчик, используя HandlerInterceptorAdapter , который имеет доступ к HttpServletRequest
public class AuditRestInterceptor extends HandlerInterceptorAdapter implements HandlerInterceptor {
private static Logger log = LoggerFactory.getLogger(AuditRestInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String referer = request.getHeader("Referer");
log.info(referer); // return null
return true;
}
Я попробовал простой вызов, подобный этому:
@RestController
@RequestMapping(value = "/api/runtime/case")
public class CaseController {
@Autowired
private CaseService caseService;
@RequestMapping(value = "/{cidla}", method = RequestMethod.GET)
public CaseDto load(@PathVariable("cidla") String cidla) {
return caseService.load(cidla);
}
}
CaseService вызов другогоконечная точка, подобная этой:
@Component
public class CaseServiceImpl implements CaseService {
@Autowired
private RestTemplate restTemplate;
@Override
public CaseDto load(String cidla) {
String host = "http://localhost:8080";
restTemplate.getForObject(host + "/smart/api/runtime/case/{cidla}/record", RecordDto.class, cidla);
Case c = loadCase(cidla);
return transformCase(c);
}
}
Желаемое поведение - первый вызов / api / runtime / case / {cidla} должен вернуть родительский URL как ноль (я его вызываю), а затем второй вызов / smart / api / runtime / case / {cidla} / record должен вернуть / api / runtime / case / {cidla} , потому что caseServiceImpl вызывает его.Я перехватываю второй вызов и пытаюсь
String referer = request.getHeader("Referer");
, но он возвращает ноль.