2016-04-19 3 views
1

Ich versuche mithilfe von Retrofit 1.9 für Android Nest-Strukturen über die Nest-API anzufordern.Keine Strukturen von Nest mit Retrofit auf Android erhalten

Konnte nicht einfacher sein: Erhaltenauth Token funktioniert gut, dann gebe ich HTTP GET Anfrage mit Autorisierung header = "Bearer TOKEN". Die Abfrage funktioniert über Postman- und APC-Clients. In der Android-App bekomme ich jedoch "nicht autorisierte" Antworten. (Ich sehe es im Android Monitor).

Irgendwelche Hinweise?

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); 

} 

öffentliche Schnittstelle NestService {

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

}

Würde schätzen Vorschläge.

Antwort

1

Ich werde dies hier setzen, weil es länger als ein Kommentar ist, aber es wird keine vollständige Antwort sein, weil es auf Annahmen basiert.

Erste und die einfachste Sache zu erkennen, ist dies:

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

Dies ist eigentlich nicht das tun, was Sie beschreiben. Es fügt nicht wirklich Authorization: Bearer TOKEN hinzu, aber es fügt Authorization: BearerTOKEN hinzu. Wie Sie sehen können, ist zwischen Bearer und TOKEN ein Platzmangel vorhanden, der zu einem möglichen nicht autorisierten Fehler führen kann. Wenn dies ein Tippfehler in der Frage ist, die Sie gepostet haben, und in Ihrem Code ist tatsächlich ein Leerzeichen, hier ist, was Sie tun können.

Meine Erfahrungen aus der Vergangenheit führt mich zu glauben, dass jedes Mal, wenn jemand sagt: „... es funktioniert über Postman und APC ... Einsatz mehr REST Kunden hier ...“ ist es, weil diese Werkzeuge ihre eigenen Header der hinzufügen Rufen Sie an, dass der Benutzer nichts davon weiß. Diese Header werden von Retrofit nicht automatisch hinzugefügt und irgendwie kommt der Backend-Server damit nicht klar.

Ich würde Ihnen empfehlen, diese Header zu überprüfen und sie mit denen zu vergleichen, die Ihr Retrofit-Anruf sendet (protokollieren Sie sie und überprüfen Sie sie). Wenn einige fehlen, versuche sie hinzuzufügen.

Hoffe, dass Sie damit beginnen.

+0

Danke Fred, habe ich mit und ohne Platz versucht, und habe versucht, die Header, die postman/apc macht. Es funktioniert hier nicht und funktioniert immer in Clients. Beendet Routing-Anfrage über Backend-Server (es gibt keine Performance/Timing-Anforderungen) und es funktionierte wie ein Charme. – vitalyr

+0

Cool, froh, dass es funktioniert hat. Wenn Sie noch Hilfe benötigen, können wir es Ihnen vielleicht geben, wenn Sie Ihre Frage bearbeiten möchten, um die Protokolle und die Änderungen, die Sie vorgenommen haben, hinzuzufügen.Prost! – Fred

1

Ich hatte das gleiche Problem. Es war mit meiner Erlaubnis verbunden. Überprüfe deine Erlaubnis. Hier ist meine Implementierung in Retrofit 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; 
} 

}

alle Informationen zu erhalten:

public interface ApiService { 


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

}

bekomme ich nur ein Retrofit Response und analysiert es von mir selbst.