【问题标题】:Failing to get structures from Nest with Retrofit on Android在 Android 上使用 Retrofit 无法从 Nest 获取结构
【发布时间】:2016-08-11 23:33:55
【问题描述】:

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

再简单不过了:获取身份验证令牌工作正常,然后我发出 HTTP GET 请求,授权标头 = "Bearer TOKEN"。查询通过 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);

}

公共接口 NestService {

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

}

非常感谢您的建议。

【问题讨论】:

    标签: retrofit nest-api


    【解决方案1】:

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

    首先也是最容易发现的是:

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

    这实际上并没有按照您的描述进行。它并没有真正添加Authorization: Bearer TOKEN,但它添加了Authorization: BearerTOKEN。如您所见,BearerTOKEN 之间缺少空格,这将导致可能出现未经授权的错误。如果这是您发布的问题中的错字并且在您的代码中实际上有一个空格,那么您可以这样做。

    我过去的经验让我相信,每次有人说“......它通过 Postman 和 APC 工作......在此处插入更多 REST 客户端......”这是因为这些工具添加了他们的用户不知道的调用的自己的标题。这些标头不会通过改造自动添加,并且后端服务器无法处理此问题。

    我建议您检查这些标题并将它们与您的改造电话发送的标题进行比较(记录并检查它们)。如果缺少一些,请尝试添加它们。

    希望这能让你开始。

    【讨论】:

    • 感谢 Fred,我尝试了有无空格,并尝试添加 postman/apc 所做的标题。它在这里不起作用,并且总是在客户端中起作用。通过后端服务器结束路由请求(没有性能/时间要求),它就像一个魅力。
    • 酷,很高兴你能成功。如果您仍然需要帮助,如果您想编辑您的问题以添加日志和您所做的更改,我们可以为您提供帮助。干杯!
    【解决方案2】:

    我遇到了同样的问题。这与我的许可有关。检查您的许可。这是我在改造 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 并自己解析它。

    【讨论】:

      猜你喜欢
      • 2017-07-16
      • 2021-11-23
      • 2017-06-12
      • 2021-11-15
      • 2014-10-25
      • 2019-08-26
      • 2022-01-23
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多