Android Retrofit 2.0.0-beta2 Post string body 动态 header

标签 android httpclient retrofit

Retrofit 2.0.0-beta2

@Headers({
            "Authorization: {authorization}",
            "Content-Type: application/json"
    })
    @POST("/api/{id}/action/")
    Call<String> postfn(@Header("Authorization") String authorization, @Path("id") String id, @Body String body);

i am using Gson converter .addConverterFactory(GsonConverterFactory.create(gson))

i am getting error code=400, message=Bad Request Should i use a custom converter?

Please help

最佳答案

你不能把这两件事放在一起。

有两种方法可以在 retrofit 2.0 的请求上放置动态 header

1: 只放在方法签名中

@Headers({
    "Content-Type: application/json"
})
@POST("/api/{id}/action/")
Call<String> postfn(@Header("Authorization") String authorization, @Path("id") String id, @Body String body);

2:使用请求拦截器添加固定的动态头

public class TraktvApiProvider implements Provider<TraktvApi> {

    public static final String BASE_URL = "https://api-v2launch.trakt.tv/";

    @Override
    public TraktvApi get() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(JacksonConverterFactory.create())
                .build();

        retrofit.client().interceptors().add(new LoggingInterceptor());

        return retrofit.create(TraktvApi.class);
    }

    private class LoggingInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {

            Request request = chain.request();

            request = request.newBuilder()
                    .addHeader("trakt-api-version", "2")
                    .addHeader("trakt-api-key", "[YOUR-API-KEY]")
                    .build();

            Response response = chain.proceed(request);

            String bodyString = response.body().string();

            Log.d("Retrofit", "---------------------------------- REQUEST ----------------------------------");
            Log.d("Retrofit", String.format("%s - %s", request.method(), request.url()));
            Log.d("Retrofit", request.headers().toString());
            Log.d("Retrofit", "---------------------------------- REQUEST ----------------------------------");
            Log.d("Retrofit", "---------------------------------- RESPONSE ----------------------------------");
            Log.d("Retrofit", response.headers().toString());
            Log.d("Retrofit", "Body: " + bodyString);
            Log.d("Retrofit", "---------------------------------- RESPONSE ----------------------------------");

            return response.newBuilder()
                    .body(ResponseBody.create(response.body().contentType(), bodyString))
                    .build();
        }
    }
}

关于Android Retrofit 2.0.0-beta2 Post string body 动态 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33480160/

相关文章:

android - android中的数据绑定(bind)复杂列表

android - 使用 ArrayAdapter<List<item>> 时 ListView 显示为空白

hadoop - "Content-type"用于使用 Web HDFS REST 客户端上传 jars 文件

android - 我没有使用 Retrofit Android 从 REST API 获得响应

android - 如何使用 Retrofit 从 android 发送 FCM 通知?

java - Android中如何将字符转换为 boolean 二维数组?

android - 如何在 Android 中为文件生成 MD5 校验和?

c# - HttpResponseMessage 的处理是调用请求流的处理

java - AXIS2 如何设置连接重试?

android - 以音频/mp3 形式上传后,Retrofit 将内容类型覆盖为 multiformpartbody/form-data