Retrofit2不消耗端点-Spotify API

时间:2018-11-23 19:21:50

标签: retrofit rx-java

我正在尝试将Retrofit2与Observables和Lombok一起用于我的模型,以获取Spotify API的令牌。我尝试过邮递员,它可以正常工作,但是我遇到了Java问题。我有这3个班级:

AuthorizationServiceCommandImpl.java

import com.service.userservice.feature.authorization.backend.model.Token;
import lombok.NonNull;
import okhttp3.OkHttpClient;
import org.springframework.stereotype.Service;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Single;
import rx.schedulers.Schedulers;

@Service
public class AuthorizationServiceCommandImpl implements AuthorizationServiceCommand {


    private AuthorizationService authorizationService;

    private static OkHttpClient createOkHttpClient() {
        final OkHttpClient.Builder httpClient =
                new OkHttpClient.Builder();
        return httpClient.build()
    }

    public void getToken(String code) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://accounts.spotify.com/api/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(createOkHttpClient())
                .build();

        authorizationService = retrofit.create(AuthorizationService.class);

        // At this point all these attributes have a value, I used System.out.println to confirm:
        // clientId, clientSecret, grantType, code, redirectUri

        authorizationService
                .getToken(clientId, clientSecret, grantType, code, redirectUri)
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.computation())
                .map(token-> token.toString());
    }
}

AuthorizationService.java

import com.service.userservice.feature.authorization.backend.model.Token;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import rx.Single;

public interface AuthorizationService {

    @FormUrlEncoded
    @POST("token")
    Single<Token> getToken(@Field("client_id") String clientId,
                        @Field("client_secret") String clientSecret,
                        @Field("grant_type") String grantType,
                        @Field("code") String code,
                        @Field("redirect_uri") String redirectUri);

}

我的模型Token.java

import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@SuppressWarnings("PMD.UnusedPrivateField")
public class Token {

    @SerializedName("access_token")
    private String accessToken;

    @SerializedName("token_type")
    private String tokenType;

    @SerializedName("expires_in")
    private String expiresIn;

    @SerializedName("refresh_token")
    private String refreshToken;

    @SerializedName("scope")
    private String scope;

    @SerializedName("error_description")
    private String errorDescription;

    @SerializedName("error")
    private String error;

    @Override
    public String toString() {
        System.out.println("Token{" +
            "accessToken='" + accessToken + '\'' +
            ", tokenType='" + tokenType + '\'' +
            ", expiresIn='" + expiresIn + '\'' +
            ", refreshToken='" + refreshToken + '\'' +
            ", scope='" + scope + '\'' +
            ", errorDescription='" + errorDescription + '\'' +
            ", error='" + error + '\'' +
            '}');
        return "Token{" +
            "accessToken='" + accessToken + '\'' +
            ", tokenType='" + tokenType + '\'' +
            ", expiresIn='" + expiresIn + '\'' +
            ", refreshToken='" + refreshToken + '\'' +
            ", scope='" + scope + '\'' +
            ", errorDescription='" + errorDescription + '\'' +
            ", error='" + error + '\'' +
            '}';
    }
}

此行不显示任何内容:

.map(token-> token.toString());

就像通话从未完成。不知道如何确认通话已完成,还尝试删除这2条Observables行

.subscribeOn(Schedulers.io()) .observeOn(Schedulers.computation())

然后返回

Single<Token> getToken(@Field("client_id") String clientId,

但不起作用。任何想法?预先感谢

1 个答案:

答案 0 :(得分:0)

代码:

.map(token->token.toString());

做某事:它返回修改后的observable。但是,然后丢弃了修改后的可观察对象。必须订阅可观察对象才能激活它。

有可能您不愿在最后添加运算符:

.map(token->token.toString())
.subscriber();

但是,不清楚要对映射的字符串做什么。