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
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();
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"
})
Versuchen:
@POST("user/classes")
Call<playlist> addToPlaylist(
@Header("Content-Type") String contentType,
@Body PlaylistParm parm);
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 !!
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();
vielleicht brauchen Sie '/' und sollten den Content-Typ am besten nicht selbst ändern.
@POST("user/classes/")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);