未能在Android上使用Retrofit从Nest获取结构

时间:2016-04-19 16:33:07

标签: retrofit nest-api

我正在尝试通过Nest API在Android上使用Retrofit 1.9来请求Nest结构。

不可能更简单:获取身份验证令牌工作正常,然后我发出带有Authorization header =" Bearer TOKEN "的HTTP GET请求。该查询通过Postman和APC客户端工作。但是,在Android应用程序中,我正在获取"未授权"响应。 (我在Android监视器中看到它。)

任何线索?

public void nestGetStructures(final String token, Callback<JsonElement> c)
{
    final String uri = "https://developer-api.nest.com";

    RequestInterceptor requestInterceptor = new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Authorization", "Bearer" + token);
        }
    };

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .setEndpoint(uri)
            .setRequestInterceptor(requestInterceptor)
            .build();

    NestService nestService = restAdapter.create(NestService.class);
    nestService.get_structures(c);

}

public interface NestService {

    @GET("/structures")
    void get_structures(    Callback<JsonElement> callback );

}

非常感谢建议。

2 个答案:

答案 0 :(得分:1)

我会把它放在这里,因为它比评论更长,但它不是一个完整的答案,因为它是基于假设。

首先,最容易发现的是:

request.addHeader("Authorization", "Bearer" + token);

这实际上并没有你所描述的。它并没有真正添加Authorization: Bearer TOKEN,但它添加了Authorization: BearerTOKEN。正如您所看到的,BearerTOKEN之间的空间不足会导致未经授权的错误。如果这是您发布的问题中的拼写错误,并且在您的代码中实际上有一个空格,这就是您可以做的。

我过去的经历让我相信每次有人说“......它通过Postman和APC工作...... 在这里插入更多REST客户端 ...”这是因为这些工具添加了他们的拥有用户不知道的呼叫的标头。这些标题不会通过改造自动添加,并且后端服务器无论如何都不能解决这个问题。

我建议您检查这些标题,并将它们与您的改装调用发送的标题进行比较(记录并检查它们)。如果有些遗失,请尝试添加它们。

希望这能让你开始。

答案 1 :(得分:1)

我遇到了同样的问题。这与我的许可有关。检查你的许可。这是我在改造2中的实施:

public class ApiBuilder {
private static String BASE_URL = "https://developer-api.nest.com";
OkHttpClient defaultHttpClient;
NestToken mAccessToken;


/**
 * Construct a new {@code ApiBuilder}.
 *
 * @return an instance of {@link ApiBuilder}
 * @param accessToken
 */
public ApiBuilder(NestToken accessToken) {
    this.mAccessToken=accessToken;
    buildClient(mAccessToken);
}

private void buildClient(final NestToken accessToken) {
    //final String basic =
    //        "Bearer " + Base64.encodeToString(accessToken.getBytes(), Base64.NO_WRAP);
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    /**
     * set your desired log level
     * */
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    defaultHttpClient = new OkHttpClient.Builder()
            .addNetworkInterceptor(
                    new Interceptor() {
                        @Override
                        public Response intercept(Chain chain) throws IOException {
                            Request request = chain.request().newBuilder()
                                    .addHeader("Authorization", "Bearer "+accessToken.getToken())
                                    .addHeader("Content-Type", "application/json").build();
                            return chain.proceed(request);
                        }
                    }).addInterceptor(logging).build();
}



/**
 * Initiate a {@link ApiService} instance.
 *
 * @return an instance of {@link ApiService}.
 */
public ApiService createApiService() {
    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(defaultHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    ApiService apiService = retrofit.create(ApiService.class);
    return apiService;
}

}

获取所有信息:

public interface ApiService {


@Headers("Cache-Control: max-age=640000")
@GET("/")
Call<ResponseBody> getAllDataAndStructure();

}

我只是得到一个Retrofit ResponseBody并自己解析它。