【问题标题】:Is it possible to use retrofit without model class?是否可以在没有模型类的情况下使用改造?
【发布时间】:2016-11-09 09:16:03
【问题描述】:

我在改造库中使用模型类时遇到问题。后端字段名称已更改。

没有模型类是否可以获得响应?

【问题讨论】:

  • 如果你的后端不可靠,那么 Retrofit 可能是错误的库。坚持使用 OkHttp
  • 问题没有意义 ... Retrofit - Type-safe Square, Inc. 的 Android 和 Java 的 HTTP 客户端 ... 是否有可能在没有模型类的情况下获得响应? 那你最后想得到什么?
  • @Selvin OP 可能意味着只获取原始字符串,而不是需要映射到用户定义的 POJO 类的东西
  • ... 或者可能是一些字典(HashMap)... 但正如您所写 - 为什么要改造呢? ...仍然 OP 可能意味着只获取原始字符串 ...好吧,没有在问题中发布这个只是盲目猜测

标签: java android retrofit retrofit2


【解决方案1】:

是的,你可以。

@POST("url")

 Call<JsonObject> register(@Query("name") String name,

                           @Query("password") String password);

只需根据您的响应编写 JsonArray 或 JsonObject 即可,而不是 Model 类。

然后,从 JsonObject 或 JsonArray 中获取数据,如下所示

Call<JsonObject> call = application.getServiceLink().register();

call.enqueue(new Callback<JsonObject>() {
            @Override
            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                JsonObject object = response.body();
                //parse object 
            }

            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {

            }
        });

【讨论】:

  • 嗨,谢谢你的回复,我有非法参数异常,请告诉我如何定义改造。它在 GET 方法中不起作用
  • 感谢 Chetan 先生,问题已解决
【解决方案2】:

完全可以使用不同的返回值。我假设您当前使用 Gson 反序列化 JSON 响应,并将它们转换为实际的类。但是,您可以选择将返回的响应转换为 JsonElement(或一些更具体的 JSON 类),在这种情况下,您将获得一个 JSON 项,您可以根据需要对其进行操作。比如:

@GET("url")
Call<JsonElement> apiCall();

【讨论】:

  • 我认为转换器不是问题所在。 OP 表示 JSON 字段已更改,因此使 Jackson 或 Gson 提供的潜在 JSON 注释无效
  • 感谢马尔科姆先生,我已解决问题
  • @Vadivel 您可以为对您有帮助的答案投票,不要忘记接受对您最有帮助的答案。
  • 很抱歉马尔科姆先生,我的名声还不够大,
  • @Vadivel 你的声望已经足够了,你只需要 15 分就可以了。
【解决方案3】:

@Vadivel 这里是基于@chetan 工作的 GET 版本:

@GET("http://your.api.url")
Call<JsonObject> getGenericJSON();

Call<JsonObject> call = api.getGenericJSON();
call.enqueue(new Callback<JsonObject>() {

    @Override
    public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
        if (response.isSuccessful() && response.body() != null) {
            Log.d(TAG, response.body().toString());
        } else {
            Log.e(TAG, "Error in getGenericJson:" + response.code() + " " + response.message());
        }
    }

    @Override
    public void onFailure(Call<JsonObject> call, Throwable t) {
        Log.e(TAG, "Response Error");
    }
});

【讨论】:

    【解决方案4】:

    没有模型类是否可以得到响应

    如果我说对了 - 当然可以。您不必使响应 JSON 自动转换。如果需要,您可以通过检索原始响应轻松手动完成此操作。一旦你得到了,你可以做任何你需要的。

    【讨论】:

    • @Vadivel,如果你解决了这个问题,你能否给出一些与你的问题相对应的答案以及你如何解决它。我面临和你一样的问题。谢谢。
    • 我只是参考这个问题的第一个答案帖子。只需使用 Call 代替 Call
    • @Vadivel,现在可以了。谢谢。
    【解决方案5】:

    您可以简单地使用“重命名”您身边的字段

    @SerializedName("newFieldName")
    SomeClass oldField;
    

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多