УДАЛИТЬ запрос с телом (без использования устаревшего HttpEntity)

Я хотел выполнить HTTP-запрос DELETE с Body. Я использую Spring Framework.

Для этого мне нужно было сделать следующую модификацию:

RestTemplate _deleteManager;
_deleteManager = new RestTemplate();
_deleteManager.setRequestFactory(new HttpComponentsClientHttpRequestFactory() {
    protected HttpUriRequest createHttpRequest(HttpMethod httpMethod, URI uri) {
        if (HttpMethod.DELETE == httpMethod) {
            return new HttpEntityEnclosingDeleteRequest(uri);
        }
        return super.createHttpRequest(httpMethod, uri);
    }
});

public static class HttpEntityEnclosingDeleteRequest extends HttpEntityEnclosingRequestBase {
    public HttpEntityEnclosingDeleteRequest(final URI uri) {
        super();
        setURI(uri);
    }

    @Override
    public String getMethod() {
        return "DELETE";
    }
}

Тогда я использую _deleteManager сделать звонок

_deleteManager.exchange(url, HttpMethod.DELETE, requestEntity, ResponseClass.class);

Это работает правильно, однако в коде HttpUriRequest а также HttpEntityEnclosingRequestBase помечены как устаревшие.

Какую альтернативу я должен использовать вместо этого? Я искал в Интернете, но ничего не смог найти.

РЕДАКТИРОВАТЬ: Или достаточно простого ответа, который показывает, как выполнить запрос DELETE с телом.

Спасибо

2 ответа

Решение

Проверьте соответствующую тему в официальном журнале изменений версии 6.0. Поэтому вы должны использовать класс HttpURLConnection.

Пример:

URL url = new URL("your_url");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
    urlConnection.setRequestMethod("DELETE");
    urlConnection.setDoOutput(true);
    // Maybe you should set the request properties here too, but it depends on your body.

    OutputStreamWriter osw = new OutputStreamWriter(urlConnection.getOutputStream());
    osw.write("this_is_the_body");
    osw.flush();

    int HttpResult = urlConnection.getResponseCode(); 
    if(HttpResult == HttpURLConnection.HTTP_OK) {
        InputStream is = new BufferedInputStream(urlConnection.getInputStream());
        // Handle the response.
    } else {
        // ...
    }
}
finally {
    urlConnection.disconnect();
}

Вариант А) Использовать Unirest

Unirest.delete("http://url.example.com").body("request-body").asString();

Вот и все.

Вариант Б) Если вы не хотите использовать эту библиотеку, используйте Apache HttpClient, который является наиболее широко используемой библиотекой http для Java. Однако вам нужно создать небольшой класс для удаления с body to work:

import java.net.URI;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
public class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
    public static final String METHOD_NAME = "DELETE";
    public String getMethod() {
        return METHOD_NAME;
    }
    public HttpDeleteWithBody(final String uri) {
        super();
        setURI(URI.create(uri));
    }
}

и использовать его через:

HttpDeleteWithBody request = new HttpDeleteWithBody(url);
request.addHeader("accept-encoding", "gzip"); //add some headers if you like
request.setEntity(new StringEntity(body, "UTF-8"));
HttpClient httpClient = HttpClients.createDefault();
HttpResponse response = httpClient.execute(request);
Другие вопросы по тегам