Spring HttpRequest получить родительский URL - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть приложение 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");

, но он возвращает ноль.

1 Ответ

0 голосов
/ 16 сентября 2018

Попробуйте это:

URL url = new URL(request.getHeader("Referer")); //where request is the HttpServletRequest
System.out.println(url.getPath());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...