webentwicklung-frage-antwort-db.com.de

Nachrüstung-2-Inhaltstyp-Problem

Meine API akzeptiert Content-Type-Anwendung/Json als Header 

@Headers("Content-Type: application/json")
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

Im Anforderungsprotokoll wird jedoch der Inhaltstyp txt/html zurückgegeben. Wie soll ich dieses Problem beheben? Diese API funktioniert gut in POSTMAN  enter image description here

 enter image description here

sie können eine unter meinen Lösungen ausprobieren:

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

dann ruf an 

mAPI.addToPlayList("application/json", playListParam);

Oder

Erstellen Sie ein HttpClient-Objekt 

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

Dann zum Retrofit-Objekt hinzufügen

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();
14
Phan Dinh Thai

Versuchen Sie dies für Retrofit 1.9 und 2.0. Für Json Content Type.

@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

Sie können viele weitere hinzufügen

@Headers({
        "Accept: application/json",
        "User-Agent: Your-App-Name",
        "Cache-Control: max-age=640000"
    })
12
Avinash Verma

Versuchen:

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

Retrofit 2.0 hat mich verrückt gemacht . Ich gab schließlich auf und versuchte es: Android Async Http

Und es funktionierte beim ersten Mal ... Ich weiß, was Sie denken, dass ich nach stckovflw-Punkten suche. Oder ich bin irgendwie flammend Retrofit. Ich bin nicht Konto mit einer einfachen Inline-Authentifizierung: https: // [Benutzername]: [Kennwort] @ api.bitbucket.org/2.0/repositories/[Benutzername]

Mit Retrofit erhielt ich eine weitere Antwort. Ein HTTP-200, aber nicht die Nutzlast. Ich würde erwarten, wie Sie es von Postman bekommen würden. Ich habe alles versucht, was ich finden konnte, damit es funktioniert. Ich glaube, ich habe 2 Tage Zeit. Ich denke, Sie denken vielleicht, Sie haben Ihre baseUrl nicht richtig erstellt ... oder den URI für die Ressource. Schauen Sie sich das oben an, wie unkompliziert es sein kann ... Ich habe versucht, die URI auf die min. und Setzen der baser URL auf den längsten Teil des Obigen; Erinnerung: Ich habe einen HTTP 200 zurückbekommen. Aber nicht die richtige Antwortnutzlast!

Ein Kollege von mir schlug vor, die asynchrone lib zu verwenden. und angesichts der Empfehlungen .__ für Retrofit und der Zeit, die ich verbracht hatte, war ich skeptisch . Es funktionierte beim ersten Mal !!

1
Beezer

Hier ist eine Lösung, die wie Retrofit2 (v2.5) und Okhttp3 funktioniert. Funktioniert besonders gut, wenn Sie diese Header zu einer Reihe von Anforderungen hinzufügen

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

vielleicht brauchen Sie '/' und sollten den Content-Typ am besten nicht selbst ändern.

@POST("user/classes/")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
0
Yongjian H