【问题标题】:Two Different Response in Retrofit改造中的两种不同反应
【发布时间】:2018-10-23 15:35:13
【问题描述】:

我正在使用 RetrofitPOJO 来发送注册屏幕,这通常有效,但根据结果是否有效,答案有两个不同的对象。分别是:

{
    "errors": {
        "nome": [
            "Campo obrigatório"
        ],
        "sobrenome": [
            "Campo obrigatório"
        ]
    }
}

和:

{
    "success": {
        "nome": [
            "Campo obrigatório"
        ],
        "sobrenome": [
            "Campo obrigatório"
        ]
    }
}

还有我的 POJO:

public class PostCadastro {

@SerializedName("nome")
@Expose
private String nome;
@SerializedName("sobrenome")
@Expose
private String sobrenome;

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getSobrenome() {
    return sobrenome;
}

public void setSobrenome(String sobrenome) {
    this.sobrenome = sobrenome;
}

我该如何处理这两个响应?

【问题讨论】:

    标签: android json retrofit2 pojo


    【解决方案1】:

    改造回复了解@SerializedName注解

    public class PostCadastroResponse {
        @SerializedName("succes")
        @Nullable
        PostCadastro successResponse;
        @SerializedName("errors")
        @Nullable
        PostCadastro errorResponse;
    }
    

    如果错误,则错误将不是null,否则为成功。

    但更简洁的架构可能是您的服务器在发生错误时返回正确的代码和正确的错误消息。您可以在Response 类中使用标准Retrofit 的isSuccessful

    【讨论】:

    • 也许alternate 属性也适用于@SerializedName
    【解决方案2】:

    我假设 PostCadastro 是您用来接收 API 响应的对象。在这种情况下,您没有名为“errors”的变量或名为“success”的变量来接收正确的响应。

    响应对象中的变量名称需要与 JSON 树中的第一个节点匹配。在这种情况下,nome 和 sobrenome 是“errors”和“success”的子节点,因此改造将在名为“errors”或“success”的响应对象中搜索实例变量,但不会找到它,并且您的PostCadastro 对象将为空。

    【讨论】:

      【解决方案3】:

      如果您有两个响应的成功状态代码,您可以创建:

      @SerializedName(value = "success", alternate = {"errors"})
      @Expose
      private PostCadastro postCadastro;
      
      public PostCadastro getPostCadastro() {
          return postCadastro;
      }
      
      public void setPostCadastro(PostCadastro postCadastro) {
          this.postCadastro = postCadastro;
      }
      
      public static class PostCadastro {
          @SerializedName("nome")
          @Expose
          private List<String> nome;
          @SerializedName("sobrenome")
          @Expose
          private List<String> sobrenome;
      
          public List<String> getNome() {
              return nome;
          }
      
          public void setNome(List<String> nome) {
              this.nome = nome;
          }
      
          public List<String> getSobrenome() {
              return sobrenome;
          }
      
          public void setSobrenome(List<String> sobrenome) {
              this.sobrenome = sobrenome;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-16
        • 1970-01-01
        • 2021-12-28
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        • 2018-05-12
        • 2018-07-10
        相关资源
        最近更新 更多