2017-07-04 1 views
0

Situation: J'ai un jeton API et je souhaite obtenir des données json. Mais ce jeton doit être utilisé comme en-tête, pas comme paramètre de requête. Comme je l'ai compris, je ne pouvais pas taper sur la demande de mon navigateur avec en-tête. Pour plus d'informations sur l'API que j'utilise, vous pouvez y rechercher: https://developer.fantasydata.com/docs/services/594407b00f14bf15264fd958/operations/5944088b14338d0eb80b2809Comment récupérer JSON en utilisant retrofit avec en-têtes?

Problème: Étant donné que je ne connais pas le type de champs requis par la requête JSON, je ne peux pas créer de classe pour ces données json. Je veux utiliser JacksonConverter. Donc la question est: comment obtenir ce JSON et regarder à quoi cela ressemble, puis créer une classe pour cela afin de convertir?

Ci-dessous vous pouvez voir mon code avec des commentaires compréhensibles:

Ma classe PrefsApplication pour la création de demande http:

public class PrefsApplication extends Application { 
    private static Retrofit retrofit = null; 

    static String base = "https://api.fantasydata.net/v3/soccer/scores/"; // my base url 

    public static Retrofit getClient() { 
     if(retrofit == null) { 
      retrofit = new Retrofit.Builder().baseUrl(base).addConverterFactory(JacksonConverterFactory.create()).build(); 
     } 
     return retrofit; 
    } 
} 

Mon interface pour faire la demande get et de mettre en-tête

public interface RestInterface { 
    @Headers("Ocp-Apim-Subscription-Key: {MY_KEY}") // here is header, I don't know is it properly written? 
    @GET("scores/json/Areas") // my get request 
    Call<List<Country>> getCountries(); // here, I want to get list of countries 
} 

Il est MainActivity:

public class MainActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RestInterface rest = PrefsApplication.getClient().create(RestInterface.class); 

     Call<List<Country>>call = rest.getCountries(); 
     call.enqueue(new Callback<List<Country>>() { 
      @Override 
      public void onResponse(Call<List<Country>> call, Response<List<Country>> response) { } 

      @Override 
      public void onFailure(Call<List<Country>> call, Throwable t) { } 
     }); 
    } 
} 
+1

"Étant donné que je ne connais pas le type de champs requis par la requête JSON", pensez à utiliser un service disposant d'une meilleure documentation. Sinon, utilisez la commande 'curl' affichée sur cette page pour obtenir un exemple de sortie. – CommonsWare

Répondre

2

Vous devez ajouter un interceptor à votre instance Retrofit HttpClient. De cette façon, vous pouvez configurer des en-têtes personnalisés.

Un exemple rapide est:

private static final String API_URL = "URL"; // Override with the service URL 
private static final String YOUR_KEY = "KEY"; // Override with your key from the service 

private static Retrofit.Builder retrofit = new Retrofit.Builder().baseUrl(API_URL); 
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

public static RestInterface endpoint() { 
    httpClient.interceptors().clear(); 

    httpClient.addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Interceptor.Chain chain) throws IOException { 
      Request original = chain.request(); 

      Request.Builder requestBuilder = original.newBuilder() 
        .header("Ocp-Apim-Subscription-Key", YOUR_KEY) 
        .method(original.method(), original.body()); 

      Request request = requestBuilder.build(); 
      return chain.proceed(request); 
     } 
    }); 

    return retrofit.client(httpClient.build()).build().create(RestInterface.class); 
} 

// Then call to use a Retrofit instance with the headers 
PrefsApplication.endpoint().getCountries(); 

C'est utilisé dans toutes sortes de façons, comme l'ajout d'authentification. Vous pouvez en lire plus à ce sujet dans this complete guide pour Retrofit

Cet exemple est pour Retrofit 2+ alors assurez-vous d'ajouter compile 'com.squareup.retrofit2:retrofit:2.1.0' à vos dépendances.