我正在尝试通过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 );
}
非常感谢建议。
答案 0 :(得分:1)
我会把它放在这里,因为它比评论更长,但它不是一个完整的答案,因为它是基于假设。
首先,最容易发现的是:
request.addHeader("Authorization", "Bearer" + token);
这实际上并没有你所描述的。它并没有真正添加Authorization: Bearer TOKEN
,但它添加了Authorization: BearerTOKEN
。正如您所看到的,Bearer
和TOKEN
之间的空间不足会导致未经授权的错误。如果这是您发布的问题中的拼写错误,并且在您的代码中实际上有一个空格,这就是您可以做的。
我过去的经历让我相信每次有人说“......它通过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并自己解析它。