Як надіслати запит 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 DELETE:

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 реєстратор
CodeToLife

8

Я погоджуюся з @adietisheim та рештою людей, які пропонують HttpClient.

Я витратив час, намагаючись зробити простий дзвінок на сервіс відпочинку з HttpURLConnection, і це мене не переконало, і після цього я спробував з HttpClient, і це було дійсно більш просто, зрозуміло і приємно.

Приклад коду для здійснення http-дзвінка:

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);

Просто хотів сказати спасибі за це. Провів багато годин , намагаючись отримати свій код , використовуючи HttpURLConnectionдля роботи, але продовжував працювати в непарні помилки, а саме: cannot retry due to server authentication, in streaming mode. Слідом за вашими порадами працював на мене. Я усвідомлюю, що це не зовсім відповідає на питання, яке просить використовувати HttpURLConnection, але моя відповідь мені допомогла.
Том Катулло

@ Заздалегідь використовувати замість HttpClientBuilder
Waldemar Wosiński

3

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


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

Навіть шаблон відпочинку може бути варіантом:

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.
Тоннор

0

є простий спосіб видалити і поставити запит, ви можете просто зробити це, додавши _methodпараметр " " до вашого запиту на пошту і записати " PUT" або " DELETE" для його значення!


-1

Я рекомендував би Apache HTTPClient.


9
Чому б ви рекомендували HTTPClient? Це величезне. Я маю на увазі - за розміром.
jayarjo

1
@jayarjo, це частина SDK для Android.
Замєль

9
@Zamel: Де саме Android вводить зображення?
талонкс

1
@talonx: Я поняття не маю. Моя помилка. Мене поховали в розробці Android, отже, плутанина.
Замель

3
Коли ОП чітко сказала, що HttpUrlConnection слід використовувати, то навіщо використовувати HttpClient?
Знає не багато
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.