Как отправить PUT, DELETE HTTP-запрос в HttpURLConnection?

132

Я хочу знать, возможно ли отправить запрос PUT, DELETE (практически) через java.net.HttpURLConnectionURL на основе HTTP.

Я прочитал так много статей, описывающих, как отправлять запросы GET, POST, TRACE, OPTIONS, но я до сих пор не нашел ни одного примера кода, который успешно выполняет запросы PUT и DELETE.

матрица
источник
2
Можете ли вы показать нам код, который вы пытались использовать?
akarnokd

Ответы:

177

Чтобы выполнить HTTP PUT:

URL url = new URL("http://www.example.com/resource");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestMethod("PUT");
OutputStreamWriter out = new OutputStreamWriter(
    httpCon.getOutputStream());
out.write("Resource content");
out.close();
httpCon.getInputStream();

Чтобы выполнить HTTP-УДАЛЕНИЕ:

URL url = new URL("http://www.example.com/resource");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestProperty(
    "Content-Type", "application/x-www-form-urlencoded" );
httpCon.setRequestMethod("DELETE");
httpCon.connect();
Мэтью Мердок
источник
1
Да. Все это возможно, но в действительности зависит от API, поддерживаемого вашим провайдером почты / блога.
Мэтью Мердок
5
Привет, у меня проблемы с delete. Когда я запускаю этот код как есть, ничего не происходит, запрос не отправляется. Та же ситуация, когда я делаю postзапросы, но там я могу использовать, например, httpCon.getContent()который запускает запрос. Но это httpCon.connect()ничего не вызывает в моей машине :-)
coubeatczech
7
В приведенных выше примерах я считаю, что вам нужно будет вызвать httpCon.getInputStream () в конце, чтобы запрос был фактически отправлен.
Эрик Смит
3
Я получил "java.net.ProtocolException: DELETE не поддерживает запись"
Kimo_do
1
@edisusanto указанный ресурс (указанный URL-адресом) - это данные, которые будут удалены.
Мэтью Мердок
24

Вот как это работает для меня:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
int responseCode = connection.getResponseCode();
Эли Хейфец
источник
11
public  HttpURLConnection getHttpConnection(String url, String type){
        URL uri = null;
        HttpURLConnection con = null;
        try{
            uri = new URL(url);
            con = (HttpURLConnection) uri.openConnection();
            con.setRequestMethod(type); //type: POST, PUT, DELETE, GET
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setConnectTimeout(60000); //60 secs
            con.setReadTimeout(60000); //60 secs
            con.setRequestProperty("Accept-Encoding", "Your Encoding");
            con.setRequestProperty("Content-Type", "Your Encoding");
        }catch(Exception e){
            logger.info( "connection i/o failed" );
        }
        return con;
}

Тогда в вашем коде:

public void yourmethod(String url, String type, String reqbody){
    HttpURLConnection con = null;
    String result = null;
    try {
        con = conUtil.getHttpConnection( url , type);
    //you can add any request body here if you want to post
         if( reqbody != null){  
                con.setDoInput(true);
                con.setDoOutput(true);
                DataOutputStream out = new  DataOutputStream(con.getOutputStream());
                out.writeBytes(reqbody);
                out.flush();
                out.close();
            }
        con.connect();
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String temp = null;
        StringBuilder sb = new StringBuilder();
        while((temp = in.readLine()) != null){
            sb.append(temp).append(" ");
        }
        result = sb.toString();
        in.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        logger.error(e.getMessage());
    }
//result is the response you get from the remote side
}
Бенджамин Твайлайт
источник
Получение 'java.io.IOException: неподдерживаемый метод: положить' inJ2me sdk logger
CodeToLife
8

Я согласен с @adietisheim и остальными людьми, которые предлагают HttpClient.

Я потратил время, пытаясь сделать простой вызов службы отдыха с HttpURLConnection, и это меня не убедило, и после этого я попробовал с HttpClient, и это было действительно проще, понятнее и приятнее.

Пример кода для выполнения HTTP-вызова put выглядит следующим образом:

DefaultHttpClient httpClient = new DefaultHttpClient();

HttpPut putRequest = new HttpPut(URI);

StringEntity input = new StringEntity(XML);
input.setContentType(CONTENT_TYPE);

putRequest.setEntity(input);
HttpResponse response = httpClient.execute(putRequest);
Alvaro
источник
Просто хотел сказать спасибо за это. Провел много часов , пытаясь получить свой код , используя HttpURLConnectionдля работы, но продолжал работать в нечетные ошибки, а именно: cannot retry due to server authentication, in streaming mode. Следуя вашему совету, у меня сработало. Я понимаю, что это не совсем ответ на вопрос, который предлагается использовать HttpURLConnection, но ваш ответ мне помог.
Tom Catullo
@ Не рекомендуется использовать вместо этого HttpClientBuilder
Вальдемар Восиньски
3

UrlConnection - неудобный API для работы. HttpClient - безусловно, лучший API, и он избавит вас от потери времени на поиски того, как достичь определенных вещей, как это прекрасно иллюстрирует этот вопрос о stackoverflow. Я пишу это после того, как использовал jdk HttpUrlConnection в нескольких клиентах REST. Кроме того, когда дело доходит до функций масштабируемости (таких как пулы потоков, пулы соединений и т. Д.), HttpClient превосходит

adietisheim
источник
3

Чтобы правильно выполнить PUT в HTML, вам нужно будет окружить его try / catch:

try {
    url = new URL("http://www.example.com/resource");
    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setRequestMethod("PUT");
    OutputStreamWriter out = new OutputStreamWriter(
        httpCon.getOutputStream());
    out.write("Resource content");
    out.close();
    httpCon.getInputStream();
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (ProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
Карлос Сирвент
источник
1

Шаблон Even Rest может быть вариантом:

String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?<CourierServiceabilityRequest>....";
    RestTemplate rest = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/xml");
    headers.add("Accept", "*/*");
    HttpEntity<String> requestEntity = new HttpEntity<String>(payload, headers);
    ResponseEntity<String> responseEntity =
            rest.exchange(url, HttpMethod.PUT, requestEntity, String.class);

     responseEntity.getBody().toString();
Глория Рампур
источник
Это один из лучших ответов, которые я видел на SO.
thonnor
0

есть простой способ удалить и поместить запрос, вы можете просто сделать это, добавив _methodпараметр " " в свой почтовый запрос и написав " PUT" или " DELETE" для его значения!

Мохамад Ростами
источник
-1

Я бы порекомендовал Apache HTTPClient.

Clint
источник
9
Почему вы рекомендуете HTTPClient? Это огромный. Я имею ввиду - по размеру.
jayarjo 01
1
@jayarjo, Это часть Android SDK.
Zamel
9
@Zamel: Где именно Android входит в картину?
talonx
1
@talonx: Понятия не имею. Моя ошибка. Я был похоронен в разработке Android, отсюда и путаница.
Zamel
3
Когда OP четко сказал, что следует использовать HttpUrlConnection, тогда зачем использовать HttpClient?
Немногое знает