返回空的特定搜索结果(Spotify API)

Posted

技术标签:

【中文标题】返回空的特定搜索结果(Spotify API)【英文标题】:Specific Search Results Returning Empty (Spotify API) 【发布时间】:2020-05-20 14:45:32 【问题描述】:

我目前正在开发一个涉及 Spotify Web API 的应用程序,在该应用程序中我有一个歌曲对象列表,对于每首歌曲我想搜索它并检索相应的 URI,但是某些歌曲返回空 JSON响应...我确信我的请求是有效的,因为我得到了大多数歌曲的响应,这只是少数出现此错误。我还知道这些歌曲存在于 spotify 上,并且它们具有相同的确切名称,因为歌曲对象是从 spotify 中检索到的。

这是我收到的请求和预期响应的示例:

Request: https://api.spotify.com/v1/search?q=Wu-Tang Clan Aint Nuthing ta F' Wit artist%3AWu-Tang Clan&type=track

Response:
"tracks":"href":"https:\/\/api.spotify.com\/v1\/search?query=Wu-Tang+Clan+Aint+Nuthing+ta+F%27+Wit+artist%3AWu-Tang+Clan&type=track&offset=0&limit=20","items":["album":"album_type":"album","artists":["external_urls":"spotify":"https:\/\/open.spotify.com\/artist\/34EP7KEpOjXcM2TCat1ISk","href":"https:\/\/api.spotify.com\/v1\/artists\/34EP7KEpOjXcM2TCat1ISk","id":"34EP7KEpOjXcM2TCat1ISk","name":"Wu-Tang Clan","type":"artist","uri":"spotify:artist:34EP7KEpOjXcM2TCat1ISk"],"available_markets":
etc...

这是一个错误示例:

Request: https://api.spotify.com/v1/search?q=Da Mystery of Chessboxin' artist%3AWu-Tang Clan&type=track

Response:
"tracks":"href":"https:\/\/api.spotify.com\/v1\/search?query=Da+Mystery+of+Chessboxin%27+artist%3AWu-Tang+Clan&type=track&offset=0&limit=20","items":[],"limit":20,"next":null,"offset":0,"previous":null,"total":0

为了确保问题不在 API 端,我还尝试使用 API 文档中的 Try It Yourself 功能并得到以下结果:


  "tracks": 
    "href": "https://api.spotify.com/v1/search?query=Da+Mystery+of+Chessboxin%27+artist%3AWu-Tang+Clan&type=track&offset=0&limit=20",
    "items": [
      
        "album": 
          "album_type": "album",
          "artists": [
            
              "external_urls": 
                "spotify": "https://open.spotify.com/artist/34EP7KEpOjXcM2TCat1ISk"
              ,
              "href": "https://api.spotify.com/v1/artists/34EP7KEpOjXcM2TCat1ISk",
              "id": "34EP7KEpOjXcM2TCat1ISk",
              "name": "Wu-Tang Clan",
              "type": "artist",
              "uri": "spotify:artist:34EP7KEpOjXcM2TCat1ISk"
            
etc...

正如您所见,API 两次都收到了相同的请求,但是从我的应用程序中它返回了一个空的项目数组。 为了确保它与短时间内发送的请求数量没有任何关系,我只请求了这首特定的歌曲,但仍然收到来自 API 的空响应。如果发布代码是必要的,请告诉我,我会帮忙的,感谢您的帮助:)!

编辑: 以下是相关代码:

发送请求:

 private SharedPreferences msharedPreferences;
    private RequestQueue mqueue;
    private String songuri;
    private String search_templink;

    public PosterUtilitySpotify(RequestQueue queue, SharedPreferences sharedPreferences, String templink) 
        mqueue = queue;         
        msharedPreferences = sharedPreferences;
        search_templink = templink;
    
    public String getSongURI() 
        return songuri;
    

    public String getResults(final VolleyCallBack callBack) 
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,search_templink, null, response -> 
            Gson gson = new Gson();
            JSONObject obj = response.optJSONObject("tracks");
            JSONArray jsonArray = obj.optJSONArray("items");
            try 
                JSONObject object = jsonArray.getJSONObject(0);
                URI u = gson.fromJson(object.toString(), URI.class);
                songuri =u.getUri();
             catch (JSONException e) 
                e.printStackTrace();
            
            callBack.onSuccess();
        , error -> 

        ) 
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError 
                Map<String, String> headers = new HashMap<>();
                String token = msharedPreferences.getString("token", "");
                String auth = "Bearer " + token;
                headers.put("Authorization", auth);
                return headers;
            
        ;
        mqueue.add(jsonObjectRequest);
        return songuri;
    

构造请求:

private static final String SEARCH_ENDPOINT = "https://api.spotify.com/v1/search?q=";

private ArrayList<String> getIDS(List<Song> slist)
        ArrayList<String> retlist = new ArrayList<String>();
        for(Song s : slist)
       
           search_templink = SEARCH_ENDPOINT + s.getsName() +" artist%3A" + s.getArtist() +"&type=track";
     // both functions return a string, nothing special
            PosterUtilitySpotify psutil = new PosterUtilitySpotify(mqueue,msharedPreferences,search_templink);
            psutil.getResults(() -> retlist.add(psutil.getSongURI());
            );
       
        try 
            TimeUnit.SECONDS.sleep(3);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        return retlist;
    

【问题讨论】:

您可以尝试而不是自己构建search_templink,而是将其设置为 Spotify Web API 控制台生成的 URL?也请尝试将?q?query 作为第一个查询字符串参数。 @Bee 所以我尝试了生成的 URL 并且它起作用了,这两个查询之间的唯一区别是生成的一个用 %20% 替换空格和 / 用 %2F,所以看起来那是几首歌曲的问题,但是我对更多歌曲有问题。我将 ?q 换成了 ?query ,它解决了一首歌曲的问题,但现在有几首歌曲用 ?query 返回为空,并用 ?q 成功返回,我如何确定要使用哪一首?我也很困惑,为什么 %20 有效而空间却没有,因为 API 收到了相同的请求? Spotify Web API 文档声明使用q,所以我想这应该是正确的选择。您可以尝试用search_templink = SEARCH_ENDPOINT + URLEncoder.encode(s.getsName() +" artist:" + s.getArtist() +"&amp;type=track", "UTF-8"); 替换search_templink = ... 吗? 每个播放列表只有一个错误,编码要好得多,但错误仍然存​​在,我检查了其中一首歌,查询是相同的(生成的和我的),除了%20 被 URLEncoder 用 + 编码 你能显示一些不工作的查询的search_templink 吗?无需担心空格是如何编码的。 %20+ 在这种情况下都是有效的选项。 【参考方案1】:

第一个问题是将未编码的 url 传递给JsonObjectRequest。通过将行设置 search_templink 调整为以下内容很容易解决此问题。

search_templink = SEARCH_ENDPOINT + URLEncoder.encode(s.getsName() +" artist:" + s.getArtist(), "UTF-8") + "&type=track";

我们在评论部分发现了另一个问题。在搜索查询中包含带有特殊字符(如 ")的标题将导致 artist 过滤器中断,因此不会在 items 数组中返回任何结果。

这在客户端并不能真正解决,只能解决。一个非常强大的解决方法是只查询标题,然后检查他们的艺术家的响应曲目,直到一个与指定的匹配。请记住,如果响应的第一页上没有艺术家匹配,则在这种情况下可能需要分页。

【讨论】:

以上是关于返回空的特定搜索结果(Spotify API)的主要内容,如果未能解决你的问题,请参考以下文章

Spotify 元数据 API:限制搜索结果

Spotify API 搜索 VS 应用内搜索

Spotify 公共搜索 API

在 Spotify 的搜索 API 中按艺术家搜索的正确 python 语法?

Spotify iPhone API 搜索播放列表

Spotify api没有搜索?