web-dev-qa-db-fra.com

Problème de type de contenu Retrofit-2

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  enter image description here

 enter image description here

16

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();
14
Phan Dinh Thai

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"
    })
12
Avinash Verma

Essayer:

@POST("user/classes")
Call<playlist> addToPlaylist(
@Header("Content-Type") String contentType,
@Body PlaylistParm parm);
3
Anurag Chutani

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 !!

1
Beezer

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();
0
Mitch M

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);
0
Yongjian H