【问题标题】:onResponse() not called in REST call for Android using retrofit2onResponse() 未在使用 Retrofit2 的 Android 的 REST 调用中调用
【发布时间】:2021-01-15 01:27:18
【问题描述】:

所以,我正在尝试连接到 Scryfall 的 API 并进行自动完成调用。我已经能够正确使用他们的另一个电话,但我认为这是我遇到问题的地方。

来电:https://api.scryfall.com/cards/autocomplete?q=fire q 是查询,它将返回最多 20 个项目的列表,这些项目可以使用单词“fire”自动完成。

{
    "object":"catalog",
    "total_values":20,
    "data": [
        "Fire // Ice","Fire Imp","Firefly","Fire Whip","Fire Ants","Firebolt","Fireball","Fire Drake","Fire Snake","Firespout","Firestorm","Fireblast","Fire-Field Ogre","Fire Urchin","Fire Bowman","Fire Dragon","Fire at Will","Fire Ambush","Firemaw Kavu","Fire Juggler"
    ]
}

我正在为 Android 使用 Retrofit2。

这是我的一些代码。

这是我的端点接口

public interface ScryfallEndPoints {
//https://api.scryfall.com/cards/named?fuzzy=
@GET("cards/named")
Call<Card> getCard(
        @Query(value=("fuzzy")) String name);

//https://api.scryfall.com/cards/autocomplete?q=
@GET("cards/autocomplete")
Call<Card> getCardAutoComplete(
        @Query(value=("q")) String name);
 }

这是我在我的活动中用来执行调用的方法。

private void loadCardList()
{
    final ScryfallEndPoints apiService =
            APIClient.getClient().create(ScryfallEndPoints.class);

    Call<Map<String, String>> call = apiService.getCardAutoComplete(str);


    Toast.makeText(this, str, Toast.LENGTH_SHORT).show();


    call.enqueue(new Callback<Map<String, String>>()
    {
        @Override
        public void onResponse(Call<Map<String, String>> call, Response<Map<String, String>> response)
        {
            Toast.makeText(SuggestionResults.this, "onResponse()", Toast.LENGTH_SHORT).show();
            
        }

        @Override
        public void onFailure(Call<Map<String, String>> call, Throwable t)
        {
            Toast.makeText(SuggestionResults.this, "onFailure()", Toast.LENGTH_SHORT).show();
       
        }
    });

    //tv.setText(str);

}

这是我的模型类中的一个方法。

 @SerializedName("data")
private Map<String, String> cardList;

public Map<String, String> getCardList() {return cardList;}

所以,我觉得我尝试访问模型类中的数据的方式肯定有问题,也许是我在界面中设置它的方式。当我拨打电话时,它并没有失败,所以我没有要显示的错误日志,我只知道它会调用 onFailure() 方法,我不知道为什么。我主要需要弄清楚这一点,然后我才能着手填充列表。此外,如果有一种方法可以让我看到更多关于我正在拨打的电话的情况,那也很棒。谢谢!

【问题讨论】:

  • 您需要做的是了解“如何从 JSON 创建 POJO”以及如何在使用 Retrofit 时从 API 接收 JSON 响应。 “jsonschema2pojo.org”会帮助你
  • @rahat 我有一个 pojo 课程并使用过该网站。我只附加了该类(我的模型类)中的一部分相关代码。我已经粘贴了从该网站获得的内容。
  • 但您正在尝试在地图中接收Callback&lt;Map&lt;String, String&gt;&gt;
  • 它失败了,因为键 data 的值不是字符串而是一个数组

标签: java android retrofit2


【解决方案1】:
@GET("cards/autocomplete")
Call<Card> getCardAutoComplete(
        @Query(value=("q")) String name);
 }

然后是调用部分

//Call<Map<String, String>> call = apiService.getCardAutoComplete(str);

//It returns Call of Card type, hence it will be as follows

Call<Card> call = apiService.getCardAutoComplete(str);


    Toast.makeText(this, str, Toast.LENGTH_SHORT).show();


    call.enqueue(new Callback<Card>()
    {
        @Override
        public void onResponse(Call<Card> call, Response<Card> response)
        {
            Toast.makeText(SuggestionResults.this, "onResponse()", Toast.LENGTH_SHORT).show();
            
        }

        @Override
        public void onFailure(Call<Card> call, Throwable t)
        {
            Toast.makeText(SuggestionResults.this, "onFailure()", Toast.LENGTH_SHORT).show();
       
        }
    });

【讨论】:

  • 我对我的代码进行了一些编辑。看起来你现在拥有它,但它仍然无法正常工作。我还将我的数据方法更改为 Map 并且它也不起作用。也许我忽略了一些小事。
  • 您是否尝试过使用此代码?发生了什么?
  • 什么都没有。我在我的问题中添加了一张图片。希望它是可见的。
  • 你刚刚编辑了我的答案,编辑你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多