使用REST API传递消息头中的参数

时间:2010-10-08 16:55:31

标签: rest http-headers jersey parameter-passing

我正在开发一个REST API,我需要传输密码来为应用程序中的每个请求验证消息(来自密钥的MAC加密)。我正在考虑将它们放在消息头中,以避免在包含发布/检索的对象(XML或JSON)的消息体中添加非数据信息。

这是最佳做法吗?

我可以在标题中添加所需的参数吗?我读过我必须用“x-”作为前缀。此参数的行为与Path或Query params完全相同?

我正在使用泽西岛。

谢谢你的帮助。

1 个答案:

答案 0 :(得分:8)

  1. 是的我认为有标头参数来传输某些数据是可以接受的。 JAX-RS标准甚至定义了@HeaderParam annotation。简单example of @HeaderParam

  2. 将非标准http标头加上“x - ”前缀是一种约定。

  3. 我遇到了类似的问题:我需要在每次REST调用时传输用户令牌和应用程序ID。为了避免代码重复,我实现了PreProcessInterceptor(我正在使用Resteasy),通过它来路由所有REST请求。如果用户令牌无效且用户没有给定应用程序ID的权限,那么我将返回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;
        }
    }