Retrofit2 не использует конечную точку - Spotify API - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь использовать retrofit2 с Observables и Lombok для своих моделей, чтобы получить токен для API spotify.Я пытался с почтальоном, и он работал правильно, но у меня проблемы с 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 голосов
/ 24 ноября 2018

Код:

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

что-то делает: возвращает измененную наблюдаемую.Однако измененная наблюдаемая затем отбрасывается.Наблюдаемое должно быть подписано, чтобы активировать его.

Возможно, вы можете избежать добавления оператора в конце:

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

Однако, не ясно, что выхочу сделать с сопоставленной строкой.

...