gpt4 book ai didi

web-services - Jersey 客户端请求中的多种返回类型

转载 作者:行者123 更新时间:2023-12-03 15:33:52 26 4
gpt4 key购买 nike

我正在以下列方式使用 Jersey 客户端 API:-

User user = webRsrc.accept(MediaType.APPLICATION_XML).post(User.class, usr);

所以我期待 User 类的对象中的响应,它是一个 JAXB 注释类。
但是,有时我也可能会收到一个错误 xml,为此我创建了一个 JAXB 类 ErrorResponse。

现在的问题是,如果我的请求返回一个 ErrorResponse 对象而不是 User 我该如何处理?

我试过这样 -
ClientResponse response=null;
try {

response = webRsrc.accept(MediaType.APPLICATION_XML).post(ClientResponse.class,usr);
User usr = response.getEntity(User.class);
}catch(Exception exp)
{
ErrorResponse err = response.getEntity(ErrorResponse.class);
}

但是当我尝试在 catch 块中使用 getEntity() 时,它抛出以下异常
[org.xml.sax.SAXParseException: Premature end of file.]
at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:107)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:532)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:491) .....

好像调用了一次 getEntity() 之后,输入流就用完了。

最佳答案

我认为您在整个“REST 思维方式”中遗漏了一点。
简短回答:是的,您只能调用 getEntity 一次。您需要检查返回的 HTTP 状态以了解您应该获得什么实体。

服务器端:

  • 在设计 REST API 时,应始终使用 appropriate status codes关于 HTTP RFC .
  • 为此,请考虑使用 the ExceptionMapper interface (这是一个 example with a "NotFoundException"

  • 因此,现在您的服务器返回带有 User 对象的“HTTP status OK - 200”,或者带有错误对象的错误状态。

    客户端:

    您需要检查返回状态并根据 API 规范调整您的行为。
    这是一个快速而肮脏的代码示例:
    ClientResponse response=null;

    response = webRsrc.accept(MediaType.APPLICATION_XML).post(ClientResponse.class,usr);

    int status = response.getStatus();

    if (Response.Status.OK.getStatusCode() == status) {

    // normal case, you receive your User object
    User usr = response.getEntity(User.class);

    } else {

    ErrorResponse err = response.getEntity(ErrorResponse.class);
    }

    注意:根据返回的状态代码,此错误可能非常不同(因此需要非常不同的行为):
  • 客户端错误 40X:您的客户端请求错误
  • 服务器错误 500:服务器端发生意外错误
  • 关于web-services - Jersey 客户端请求中的多种返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2025997/

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