在Retrofit中发送POST请求中的空体

时间:2017-06-15 20:02:03

标签: java request jackson retrofit

我的api在发布帖子请求时需要一个空的json体({ })。我如何在Retrofit和Jackson中设置它?

我尝试传递null,空字符串和"{}",但无法使其正常工作。

@POST(my/url)
Call<MyResponse> createPostRequest(@Body Object empty);

如何设置空的JSON主体?

5 个答案:

答案 0 :(得分:4)

一个空对象为科特林

interface ApiService {
    @POST("your.url")
    fun createPostRequest(@Body body: Any = Object()): Call<YourResponseType>
}

答案 1 :(得分:3)

试试这个。它现在对我有用。

@POST(my/url)
Call<MyResponse> createPostRequest(@Body Hashmap );

使用此方法时将new HasMap作为paremater传递

apiservice.createPostRequest(new HashMap())

答案 2 :(得分:1)

空类可以解决问题:

class EmptyRequest {
    public static final EmptyRequest INSTANCE = new EmptyRequest();
}

interface My Service {

    @POST("my/url")
    Call<MyResponse> createPostRequest(@Body EmptyRequest request);

}

myService.createPostRequest(EmptyRequest.INSTANCE);

答案 3 :(得分:1)

使用:

@POST("something")
Call<MyResponse> createPostRequest(@Body Object o);

然后致电:

createPostRequest(new Object())

答案 4 :(得分:0)

一个老问题,但是我找到了一个更合适的解决方案,方法是使用okhttp3.Interceptor,如果不存在任何主体,则添加一个空主体。此解决方案不需要您为空的@Body添加额外的参数。

示例:

Interceptor interceptor = chain -> {
    Request         oldRequest = chain.request();
    Request.Builder newRequest = chain.request().newBuilder();

    if ("POST".equals(oldRequest.method()) && (oldRequest.body() == null || oldRequest.body().contentLength() <= 0)) {
        newRequest.post(RequestBody.create(MediaType.parse("application/json"), "{}"));
    }

    return chain.proceed(newRequest.build());
};

然后您可以像这样创建服务实例:

OkHttpClient.Builder client = new OkHttpClient.Builder();
client.addInterceptor(interceptor);

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("YourURL")
        .client(client.build())
        .build();

MyService service = retrofit.create(MyService.class);