【问题标题】:How to work with pagination URL from Soundcloud API with Retrofit如何使用来自 Soundcloud API 的分页 URL 和 Retrofit
【发布时间】:2015-12-28 15:38:05
【问题描述】:

我正在使用 Retrofit 从 Soundcloud-API 获取曲目列表。 请求会导致带有曲目列表的回调 - 无需分页即可。 但是,当我将分页参数 (linked_pa​​rtitioning=1) 添加到请求时,Retrofit 会返回错误。我无法弄清楚如何编写回调类型以将 URL-String 获取到下一页和我的列表结果。

改造电话:

Map<String, String> queryMap = new HashMap<String, String>();
queryMap.put("client_id" , My_Config.CLIENT_ID);
queryMap.put("tag", "loop" );
queryMap.put("license", "cc-by-sa" ); 
queryMap.put("limit", "10"); 

// This is causing  a different Return Type ---> ERROR
queryMap.put("linked_partitioning", "1" ); 

scService = RetrofitRestAdapter.getService();
scService.searchTracks(queryMap, callback); // callback function success  is not reached because of the ERROR

GET-Request 接口:

@GET("/tracks")
public void searchTracks(@QueryMap Map<String, String> filters, Callback<List<My_Track>> cb);

改造回调:

Callback<List<My_Track>> callbackTracks = new Callback<List<My_Track>>() {
    @Override
    public void success(List<My_Track> tracks, Response response) {...}
    @Override
    public void failure(RetrofitError error) {...}
};

改造例外:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

编辑: Soundcloud API 的结果模式:

没有分页的结果是一个 Array/List of Track-Elements,如下所示:

[{"download_url":null,"key_signature":"","user_favorite":false,...},
{...},{...}]

分页结果是一个包含集合加上next_href的元素:

{"collection":[
{"download_url":null,"key_signature":"",...},
{...},
{...}
],"next_href":"https://..."}  

我需要如何声明回调的返回类型以将 Collection-Array 和“next_href”与 Result 分开?

谢谢!

【问题讨论】:

    标签: android pagination soundcloud retrofit


    【解决方案1】:

    从您提供的错误中,我可以猜到,在您请求分页后,API 返回的结果是一个对象而不是一个数组。例如,在使用分页之前,结果会是这样的

    [
       {
          item 1,
          item 2
       },
       {
          item 1,
          item 2
       }
    
    ]
    

    使用分页后,结果会是这样的

    {
       page: 1,
       count: 400,
       results: [
           {
              item 1,
              item 2
           }, 
           {
              item 1,
              item 2
           }
       ]
    }
    

    因此您可能需要更改分页映射。 (由于您没有提供结果模式,这就是我认为您的错误的原因)

    回答编辑

    目前您正在将返回的 JSON 映射到 My_Track 类的列表中。现在您需要为映射创建另一个类,并将 My_Track 列表声明为属性。示例:

    public class MyTrackHolder {
        public final String next_href;
        public final List<My_Track> collection;
    
        public MyTrackHolder(final String next_href, final List<My_Track> collection)
        {
            this.next_href = next_href;
            this.collection = collection;
        }
    
    }
    

    你的界面会像

    @GET("/tracks")
    public void searchTracks(@QueryMap Map<String, String> filters, Callback<MyTrackHolder> cb);
    

    最后调用这个接口方法如下

    Callback<MyTrackHolder> callbackTracks = new Callback<MyTrackHolder>() {
        @Override
        public void success(MyTrackHolder trackHolder, Response response) {...}
        @Override
        public void failure(RetrofitError error) {...}
    };
    

    您可以使用检索曲目

    List<My_Track> tracks = trackHolder.collection;
    

    【讨论】:

    • 结果模式为:{"collection":[{track1},{track2},{track3}],"next_href":"https://..."} 请查看编辑!
    猜你喜欢
    • 2016-12-15
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2019-03-18
    • 2018-02-01
    相关资源
    最近更新 更多