Передача параметров в заголовок сообщения с помощью REST API - PullRequest
8 голосов
/ 08 октября 2010

Я разрабатываю REST API, и мне нужно перенести криптограммы для аутентификации сообщения для каждого запроса в аппликативном процессе (шифрование MAC из секретных ключей). Я думал о том, чтобы поместить их в заголовок сообщения, чтобы избежать добавления информации, не связанной с данными, в тело сообщения, которое содержит опубликованный / извлеченный объект (XML или JSON).

Это лучшая практика?

Могу ли я добавить в шапку столько параметров, сколько захочу? Я прочитал, что я должен префикс их с "х-". Поведение этого параметра точно такое же, как у параметров Path или Query?

Я использую Джерси.

Спасибо за помощь.

1 Ответ

8 голосов
/ 20 февраля 2011
  1. Да, я считаю, что допустимо иметь параметры заголовка для передачи определенных данных. Стандарт JAX-RS даже определяет аннотацию @ HeaderParam . Простой пример @ HeaderParam .

  2. Это условный префикс нестандартных заголовков http с "x -".

У меня была ситуация, аналогичная вашей: мне нужно было передавать маркер пользователя и идентификатор приложения при каждом вызове REST. Чтобы избежать дублирования кода, я реализовал PreProcessInterceptor (я использую Resteasy), через который маршрутизируются все REST-запросы. Если токен пользователя недействителен и если у пользователя нет привилегий для данного идентификатора приложения, я возвращаю 401 неавторизованным. Мой код выглядел примерно так (упрощенная версия):

@Provider
@ServerInterceptor
public class RestSecurityInterceptor implements PreProcessInterceptor {

    @Override
    public ServerResponse preProcess(HttpRequest request, ResourceMethod method) 
           throws UnauthorizedException {

        String token = request.getHttpHeaders().getRequestHeader("token").get(0);

        // user not logged-in?
        if (checkLoggedIn(token)) {
            ServerResponse response = new ServerResponse();
            response.setStatus(HttpResponseCodes.SC_UNAUTHORIZED);
            MultivaluedMap<String, Object> headers = new Headers<Object>();
            headers.add("Content-Type", "text/plain");
            response.setMetadata(headers);
            response.setEntity("Error 401 Unauthorized: " 
                 + request.getPreprocessedPath());
            return response;
        }
        return null;
    }
}
...