【问题标题】:Retrofit call to Spotify API returns a 404 error对 Spotify API 的改造调用返回 404 错误
【发布时间】:2022-11-15 14:25:12
【问题描述】:

我正在使用 retrofit2 尝试连接到 Spotify。现在我只是记录结果代码以查看它是否有效。当我从我的 api 调用中删除“授权”标头/参数时,它给我一个 401 错误,表明我没有被授权。当我添加授权参数并传递访问令牌时,它给我 404 错误,指示“未找到”。我对这些东西没有经验,但这让我感到困惑,请发送想法/建议。

import static com.example.spotifyapp1.spotifyconstants.Constants.CLIENT_ID;
import static com.example.spotifyapp1.spotifyconstants.Constants.REDIRECT_URI;
import static com.example.spotifyapp1.spotifyconstants.Constants.REQUEST_CODE;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import com.example.spotifyapp1.data.RetrofitInstance;
import com.example.spotifyapp1.data.SpotifyApi;
import com.example.spotifyapp1.databinding.ActivityMainBinding;
import com.spotify.sdk.android.auth.AuthorizationClient;
import com.spotify.sdk.android.auth.AuthorizationRequest;
import com.spotify.sdk.android.auth.AuthorizationResponse;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;


    Retrofit retrofit = RetrofitInstance.getRetrofitInstance();
    SpotifyApi spotifyApi = retrofit.create(SpotifyApi.class);

    Call<Response<String>> mainCall;

    String accessToken;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);


        AuthorizationRequest.Builder builder = new AuthorizationRequest.Builder(CLIENT_ID, AuthorizationResponse.Type.TOKEN, REDIRECT_URI);

        AuthorizationRequest request = builder.setScopes(new String[]{"app-remote-control","streaming"}).build();
        AuthorizationClient.openLoginActivity(this,REQUEST_CODE,request);


        binding.setVolumeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mainCall.enqueue(
                        new Callback<Response<String>>() {
                            @Override
                            public void onResponse(Call<Response<String>> call, Response<Response<String>> response) {
                                //Log.d("MainActivity",String.format("tokenAtCall:%s",accessToken));
                                Log.d("MainActivity", String.format("onResponse: code..%d",response.code()));
                            }

                            @Override
                            public void onFailure(Call<Response<String>> call, Throwable t) {
                                Log.d("MainActivity", "onFailure");
                            }
                        }
                );
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode,resultCode,intent);

        if (requestCode == REQUEST_CODE) {
            AuthorizationResponse response = AuthorizationClient.getResponse(resultCode,intent);

            switch (response.getType()) {
                case TOKEN:
                    //Log.d("MainActivity", "token");
                    accessToken = response.getAccessToken();
                    //Log.d("MainActivity",String.format("token:%s",accessToken));
                    mainCall = spotifyApi.setVolume("Bearer " + accessToken,50,null);

                case ERROR:
                    //Log.d("MainActivity", "error");

                default:
                    //Log.d("MainActivity", "default");
            }
        }
    }
}

在这里,我使用 spotify.android:auth 库对 spotify 进行身份验证。身份验证似乎有效,因为它为我提供了一个访问令牌,然后我尝试将其传递到呼叫中,但未成功。

import retrofit2.Call;
import retrofit2.Response;
import retrofit2.http.Header;
import retrofit2.http.PUT;
import retrofit2.http.Query;

public interface SpotifyApi {

    @PUT("/me/player/volume")
    Call<Response<String>> setVolume(
        @Header("Authorization") String authorization,
        @Query("volume_percent") int volumePercent,
        @Query("device_id") String deviceId
    );

}

这是我的 api

import static com.example.spotifyapp1.spotifyconstants.Constants.BASE_URL;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitInstance {

    public static Retrofit getRetrofitInstance() {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit;

    }

}

和我的改造

【问题讨论】:

    标签: java retrofit retrofit2 spotify


    【解决方案1】:

    我找到了答案! URL 的“/v1”部分需要在端点上而不是在基本 URL 中,尽管文档似乎另有说明。令人困惑和沮丧!

    【讨论】:

      猜你喜欢
      • 2012-06-22
      • 1970-01-01
      • 2021-10-28
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多