【问题标题】:Rest Api with different response for Success and FailureRest Api 对成功和失败有不同的响应
【发布时间】:2018-05-09 06:43:06
【问题描述】:

我在我的代码中使用了非常旧的第 3 方 API,例如,在成功和失败的情况下它会返回不同的响应

为了成功

 SuccessResObj{
     a{...
        b{...
           c{...}
         }
      }
    }

实际 SuccessResObj 有大约 10-15 个嵌套对象。

失败

    FailureResObj{
     status="failure because of ...";
     code="400"; // code will always be 400 in case of failure, irrespective of reason of failure
    }

FailureResObj 只有 2 个变量。

我知道它错了,但第 3 方 API 不会改变那里的响应,我必须在我的代码中解决问题,我应该如何处理它,因为我需要在数据库中记录这两种情况。

编辑

我尝试创建一个 WrapperBean

WrapperBean{
 SuccessResObj;
 FailureResObj;
}

WrapperBean=ApiResonse();

然后是它的 ClassCastExcaption,因为响应只是一种类型的对象,我正在尝试将它与具有 2 个对象的 WrapperBean 映射。

将不胜感激提供此类响应的示例处理代码。

可以简单地将其视为一种随机返回 2 种不同类型响应的方法。应该怎么处理。

【问题讨论】:

  • 这不一定是错的。每个响应状态代码可以有不同的模式类型。客户有责任了解如何读取每种可能的模式类型。
  • 什么是失败的响应码?和成功一样吗?
  • 那么我应该如何处理它。我错过了什么?
  • 成功没有响应码,只有失败才会有响应码。
  • 创建一个ResponseBean类并创建两个子类SuccessResponseBean和FailureResponseBean

标签: java rest response


【解决方案1】:

您可以使用 Jackson 将结果转换为 json 字符串。

示例:

static class C {
    String val;

    public String getVal() {
        return val;
    }

    public void setVal(String val) {
        this.val = val;
    }
}
static class B {
    private C c;

    public C getC() {
        return c;
    }

    public void setC(C c) {
        this.c = c;
    }
}
static class A {
    private B b;

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
}

static class SuccessResObj {
    private A a;

    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }
}

static class FailureResObj{
    private String status;
    private String code;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

public static void main(String[] args) throws JsonProcessingException {
    A a = new A();
    B b = new B();
    C c = new C();
    c.setVal("Hello World.");
    b.setC(c);
    a.setB(b);
    SuccessResObj successResObj = new SuccessResObj();
    successResObj.setA(a);
    FailureResObj failureResObj = new FailureResObj();
    failureResObj.setCode("400");
    failureResObj.setStatus("failure because of ...");
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(successResObj);
    System.out.println(json);
    json = mapper.writeValueAsString(failureResObj);
    System.out.println(json);
}

输出:

{"a":{"b":{"c":{"val":"Hello World."}}}}
{"status":"failure because of ...","code":"400"}

然后,将 json 字符串记录到您​​的数据库中:)

【讨论】:

    【解决方案2】:

    当您使用 RestTemplate 时,RestTemplate 将在没有 200 HTTP 状态的情况下抛出 HttpClientErrorException

    这里是示例代码:

    try {
        String successResponse = restTemplate.exchange(uri, httpMethod, httpEntity, String.class);
        // convert String in to Object using object mapper
    } catch (HttpClientErrorException e) {
        if (e.getStatusCode().value() == 400) {
            String errorResponse = e.getResponseBodyAsString();
            // convert String in to Object using object mapper
            }
        }
    }
    

    更多关于ObjectMapperview this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2018-01-08
      • 2018-07-31
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多