在REST API中添加标头会破坏向后兼容性

时间:2017-12-11 21:12:15

标签: rest jax-rs resteasy

我有一个REST接口,定义如下

public interface UserService {

    @GZIP
    @POST
    Response createUser(@HeaderParam("hostName") String hostName, User user);

}

我想再阅读两个标题 - addToCacheuseCache。显而易见的解决方案是在上面的签名中添加标题。

虽然这对于通过其他客户端进行显式HTTP调用是有效的,但修改接口签名会破坏已使用REST代理服务连接到上述服务的功能测试代码库中的向后兼容性。

我看到的唯一出路是将User对象中的两个参数传递给它。还有另一种出路吗?

1 个答案:

答案 0 :(得分:1)

您可以将标题参数作为实现类中的字段注入:

public interface UserService {
    Response createUser(String hostName, User user);
}

@Path("/userservice")
public class UserServiceRestImpl implements UserService{

    @HeaderParam("addToCache")
    private String addToCache;

    @HeaderParam("useCache")
    private String useCache;

    @GZIP
    @POST
    Response createUser(@HeaderParam("hostName") String hostName, User user){
        System.out.println(addToCache);
        System.out.println(useCache);
    }
}

更新: 尝试禁用自动扫描并明确指定资源:

<!-- disabled auto scanning
<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>
        -->
<context-param>
    <param-name>resteasy.resources</param-name>
    <param-value>com.yourpackage.UserServiceRestImpl</param-value>
</context-param>

UPDATED2:你也可以尝试注入@Context HttpHeaders而不是@HeaderParam:

private @Context HttpHeaders headers;

...

String addToCache = headers.getHeaderString("addToCache");