当前位置: 首页 > 知识库问答 >
问题:

在创建状态时设置位置头路径时,Javax响应预置方法路径

楚博雅
2023-03-14

在下面的示例中:get to“http://localhost/foo/bar”(已创建状态)的响应位置为“http://localhost/foo/bar/wibble”(请注意/foo/bar)

而get to“http://localhost/foo/baz”(ok status)则响应“http://localhost/wibble”的位置,这正是我们所希望的。

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import java.net.URI;

@Path("/foo")
public class FooResource {

    @POST
    @Path("/bar")
    public Response bar() {

        URI uriOfCreatedResource = URI.create("/wibble");
        return Response.created(uriOfCreatedResource).build();
    }

    @POST
    @Path("/baz")
    public Response baz() {

        URI uriOfCreatedResource = URI.create("/wibble");
        return Response.ok().location(uriOfCreatedResource).build();
    }
}

共有1个答案

汪德寿
2023-03-14

以防有人在这里磕磕绊绊地想知道这件事;我深入研究了泽西的代码,看看为什么会发生这种情况。这应该能解释你的问题&卡洛的变通方法

ContainerResponse包含以下gem:

private void setHeaders(MultivaluedMap<String, Object> headers) {
    this.headers = headers;
    Object location = headers.getFirst(HttpHeaders.LOCATION);
    if (location != null) {
        if (location instanceof URI) {
            final URI locationUri = (URI)location;
            if (!locationUri.isAbsolute()) {
                final URI base = (statusType.getStatusCode() == Status.CREATED.getStatusCode())
                        ? request.getAbsolutePath() // WHY!?
                        : request.getBaseUri();
                location = UriBuilder.fromUri(base).
                        path(locationUri.getRawPath()).
                        replaceQuery(locationUri.getRawQuery()).
                        fragment(locationUri.getRawFragment()).
                        build();
            }
            headers.putSingle(HttpHeaders.LOCATION, location);
        }
    }
}

换句话说:出于某种原因,有人认为如果响应状态代码为201,那么以不同的方式处理位置标头是个好主意。正如Carlo注意到的,使用绝对路径可以避免这个问题。

 类似资料:
  • 问题内容: 我有一个API调用,我需要对其进行一些检查并可能返回各种状态代码。我不需要自定义视图或任何东西,我只需要返回正确的代码。如果用户未通过适当的凭据,则需要返回401状态。如果他们尚未发送受支持的请求格式,则需要返回400状态。 因为它是一个API,所以我真正想做的就是设置响应状态并以一条简单的愚蠢消息退出,该消息说明请求失败的原因(可能使用)。刚好足以完成工作,但我还无法使其正常工作。我

  • 发生了一些非常奇怪的事情。当我输入时: 输出如下: 输入时: 输出为: 我想使用'jdk1.6.0_24',我改变了'/etc/profile'和'~/. bashrc'中的所有内容,将其指向'jdk1.6.0_24',这样的问题仍然存在。我使用的java仍然是1.8。为什么?

  • 问题内容: 我有正常路线 使用from 。 奇怪的是,这个组件很长一段时间都没有出现问题,但是现在当我用说的时候,它无法在travis- ci上编译 我在我的PrivateRoute组件中设置了此状态,这是带有重定向的非常标准的 如何更新要包含的对象的类型 编辑: 解决方案是添加 复制package.json之后,将其复制到我的Dockerfile中。 问题答案: 看起来您没有对软件包使用锁定文件

  • 我有这个代码: 为了简化它,我想使用方法: 然而,正如您所看到的,当使用方法时,我无法设置响应的状态代码。 有什么办法吗?(不使用自定义扩展功能)

  • 我正在构建一个AWS Lambda函数,它可以动态编译一个类。但是lambda函数抛出错误,因为它无法定位依赖项,即动态编译的类的导入语句。我已经给出了所遵循步骤的示例代码。 请指导我如何定位依赖项,即设置类路径,以便动态创建的类编译时不会出现任何错误 > 正在编译的示例代码 JavaCompilerCode 格拉德尔一个胖罐子 执行lambda函数时出错 要编译的文件保存在 /tmp目录中。我无