gpt4 book ai didi

java - ReSTLet 内容类型协商

转载 作者:搜寻专家 更新时间:2023-11-01 03:03:31 25 4
gpt4 key购买 nike

API 支持各种形式的内容协商很常见:Accept请求上的 HTTP header ,Content-Type请求上的 HTTP header (虽然我认为不符合标准),并从文件扩展名中派生出预期的类型。我希望我的 ReSTLet REST API 支持所有这些,我正在寻求帮助以弄清楚如何做到这一点。

我的第一个尝试是查看 ReSTLet 是否支持开箱即用。我正在使用 Jackson 扩展,所以我创建了一个简单的应用程序,它路由 /fooServerResource返回了 Map<String,Boolean> .

当我简单地执行到 /foo 的 GET HTTP URL 连接(la https://stackoverflow.com/a/953697/27561)时,我得到了 XML。我希望默认为 JSON。那是问题#1。 如何制作默认类型 JSON?

当我对 /foo.xml 进行相同的 HTTP URL 连接调用时或 /foo.json ,我得到一个 404。这是问题 #2。 如何使用文件扩展名来表示预期的媒体类型?

由于我在 Servlet 容器中运行,我目前的方法是包装 HttpServletRequest , 并设置 Accept HTTP header 到 application/json如果没有文件扩展名。这是目前正在解决问题 #1 的技巧。但是,我一直无法以摆脱问题 #2 中的 404 的方式扩展这种方法。

ReSTLet 使许多其他事情变得简单,以至于我假设我遗漏了一些东西 — 某些配置存在问题,我可以在某处进行调整以使其做正确的事。我在 API 文档中看到了相关提示,但没有什么明显的。那么那个配置是​​什么?

最佳答案

最简单的方法是在应用程序的路由器前添加一个自定义过滤器来执行以下操作:

  • 如果可接受的媒体类型列表为空,则设置默认媒体类型 (request.clientInfo.acceptedMediaTypes)。标题 Accept 的值在此处设置。在执行服务器资源之前设置它很重要,这样可以在从 bean 到表示的转换过程中考虑到这一点。

    Filter preferencesFilter = new Filter(getContext()) {
    protected int beforeHandle(Request request, Response response) {
    if (request.getClientInfo().getAcceptedMediaTypes().isEmpty()) {
    request.getClientInfo().accept(MediaType.APPLICATION_JSON);
    } else if ((request.getClientInfo().getAcceptedMediaTypes().size() == 1)
    && (request.getClientInfo().getAcceptedMediaTypes().get(0).getMetadata().equals(MediaType.ALL))) {
    request.getClientInfo().accept(MediaType.APPLICATION_JSON);
    }
    return super.beforeHandle(request, response);
    }
    }

    作为引用,当指定没有接受媒体类型时,ReSTLet 使用已注册的第一个转换器来实际构建响应内容。看来您的情况是 XML。

  • 检测提供的扩展以根据您的情况推断出相应的可接受媒体类型。 ReSTLet 的 TunnelService 允许对请求进行预处理,以支持使用扩展进行内容协商等功能。您可以按如下所述简单地配置它:

    public class MyApplication extends Application {
    public MyApplication() {
    getTunnelService().setExtensionsTunnel(true);
    }

    @Override
    public Restlet createInboundRoot() {
    (...)
    }
    }

否则,您在使用 ReSTLet 时不应依赖 servlet API。 servlet 扩展只应被视为将 ReSTLet 应用程序嵌入到 servlet 容器中的适配器...

它在以下地址为您的用例添加了示例项目:https://github.com/templth/restlet-stackoverflow/tree/master/restlet/test-restlet-conneg .

希望对你有帮助,蒂埃里

关于java - ReSTLet 内容类型协商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30426250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com