morristech
5/8/2018 - 12:31 PM

A retrofit client can POST empty body.

A retrofit client can POST empty body.

import com.squareup.okhttp.OkHttpClient;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import retrofit.client.Header;
import retrofit.client.OkClient;
import retrofit.client.Request;
import retrofit.client.Response;
import retrofit.mime.TypedByteArray;
import retrofit.mime.TypedOutput;

/**
 * A retrofit client can POST empty body.
 */
public class NullBodySafeClient extends OkClient {

    public NullBodySafeClient(OkHttpClient client) {
        super(client);
    }

    static Request createNullBodySafeRequest(Request request) {
        TypedOutput body = request.getBody();
        List<Header> headers = new ArrayList<>(request.getHeaders());
        if (body == null) {
            body = new TypedByteArray("text/plain;charset=UTF-8", new byte[0]);
            headers.add(new Header("Content-Length", "0"));
            return new Request(request.getMethod(), request.getUrl(), headers, body);
        }

        return request;
    }

    @Override
    public Response execute(Request request) throws IOException {
        return super.execute(createNullBodySafeRequest(request));
    }
}
RestAdapter adapter = new RestAdapter.Builder()
        .setEndpoint(API_ENDPOINT)
        .setClient(new NullBodySafeClient(new OkHttpClient()))
        .build();