代码之家  ›  专栏  ›  技术社区  ›  Zofren

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

  •  8
  • Zofren  · 技术社区  · 15 年前

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

    这是最佳做法吗?

    我可以在标题中添加任意多个参数吗?我读到我必须在它们前面加上“x-”。此参数的行为与路径或查询参数完全相同?

    我在用球衣。

    谢谢你的帮助。

    1 回复  |  直到 15 年前
        1
  •  9
  •   Peter Knego    12 年前
    1. 是的,我相信有头参数来传输某些数据是可以接受的。JAX-RS标准甚至定义了 @HeaderParam annotation . 简单的 example of @HeaderParam .

    2. 使用“x-”作为非标准http头的前缀是一种约定。

    我有一个与你类似的情况:我需要在每次REST调用时传输用户令牌和应用程序ID。为了避免代码重复,我实现了 PreProcessInterceptor (我正在使用Resteasy),所有REST请求都通过它进行路由。如果用户令牌无效并且用户没有给定应用程序ID的权限,则返回401 unauthorized。我的代码与此类似(简化版):

    @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;
        }
    }