Mon Api accepte les en-têtes Content-Type application/json .
@Headers("Content-Type: application/json")
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
Mais dans le journal des demandes, il renvoie le type de contenu txt/html.So, comment résoudre ce problème? Cette api fonctionne bien dans POSTMAN
vous pouvez en essayer une ci-dessous mes solutions:
@POST("user/classes")
Call<playlist> addToPlaylist(@Header("Content-Type") String content_type, @Body PlaylistParm parm);
alors appelez
mAPI.addToPlayList("application/json", playListParam);
Ou
Créer un objet HttpClient
OkHttpClient httpClient = new OkHttpClient();
httpClient.networkInterceptors().add(new Interceptor() {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Request.Builder requestBuilder = chain.request().newBuilder();
requestBuilder.header("Content-Type", "application/json");
return chain.proceed(requestBuilder.build());
}
});
Puis ajouter à la modification d'objet
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();
Essayez ceci pour Retrofit 1.9 et 2.0. Pour le type de contenu Json.
@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
Vous pouvez en ajouter beaucoup plus i.e
@Headers({
"Accept: application/json",
"User-Agent: Your-App-Name",
"Cache-Control: max-age=640000"
})
Essayer:
@POST("user/classes")
Call<playlist> addToPlaylist(
@Header("Content-Type") String contentType,
@Body PlaylistParm parm);
Retrofit 2.0 m'a rendu fou ... J'ai finalement abandonné et j'ai essayé: Android Async Http
Et cela a fonctionné pour la première fois… Je sais ce que vous pensez que je recherche des points stckovflw… ou je suis en quelque sorte en train de rénover… .. Je ne suis pas… .. Mon cas d'utilisation était d'appeler mon bitbucket compte avec une authentification en ligne simple: https: // [nom d'utilisateur]: [mot de passe] @ api.bitbucket.org/2.0/repositories/[nom d'utilisateur]
Avec Retrofit, je recevais une autre réponse. Un Http 200 mais pas la charge utile .__ Je m'attendrais à ce que vous obteniez de Postman . J'ai essayé tout ce que je pouvais trouver pour le faire fonctionner . J'ai perdu 2 jours à ce sujet ou plus. Je pense que vous pensez peut-être que vous n'avez pas correctement formé votre baseUrl ... ou l'URI de la ressource. Regardez ce qui précède, à quel point cela peut-il être moins compliqué ... J'ai essayé de raccourcir l'URI au minimum. et définir l'URL de base sur la partie la plus longue de ce qui précède; rappel: j'ai un Http 200 en retour. Mais pas la réponse correcte charge utile!
Un de mes collègues a suggéré d'utiliser l'asynch lib. et étant donné toutes les recommandations pour la rénovation et le temps que j'avais passé, j'étais sceptique . Cela a fonctionné la première fois !!
Voici une solution qui fonctionne à partir de retrofit2 (v2.5) et okhttp3. Fonctionne particulièrement bien si vous ajoutez ces en-têtes à un certain nombre de demandes
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder requestBuilder = chain.request().newBuilder();
requestBuilder.header("Content-Type", "application/json");
requestBuilder.header("Accept", "application/json");
return chain.proceed(requestBuilder.build());
}
});
OkHttpClient httpClient = httpClientBuilder.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build();
vous avez peut-être besoin de '/' et il est préférable de ne pas changer le type de contenu par vous-même… juste comme ceci:
@POST("user/classes/")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);