Удаление HTTP с проблемами тела запроса - PullRequest
5 голосов
/ 01 февраля 2012

Может кто-нибудь объяснить следующее:

package com.foo.bar;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import org.springframework.util.FileCopyUtils;

public class ATest {

    public static void main(String[] args) throws Exception {
       try {
           final String payload = "{\"parentExecutor\":\"foo1233\"}";
           URL url = new URL("http://localhost/notes");
           final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
           connection.setRequestMethod("DELETE");
           connection.setRequestProperty("Accept", "application/json");
           connection.setRequestProperty("Content-Type", "application/json");
           FileCopyUtils.copy(payload.getBytes(), connection.getOutputStream());
           connection.connect();
           final InputStream is = connection.getInputStream();
           int b = is.read();
           String result = "";
           while (b != -1) {
               result += (char) b;
               b = is.read();
           }
           System.out.println(connection.getResponseCode());
           System.out.println(result);
           is.close();
       }
       catch (final ProtocolException e) {
          e.printStackTrace();
       }
   }
}

В приведенном выше примере выдается следующее исключение:

java.net.ProtocolException: cannot write to a URLConnection if doOutput=false - call setDoOutput(true)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:995)
    at com.foo.bar.ATest.main(ATest.java:24)

Однако, если я добавлю вызов к setDoOutput (true) , выдается следующее исключение:

java.net.ProtocolException: HTTP method DELETE doesn't support output
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1004)
    at com.foo.bar.ATest.main(ATest.java:25)

Затем, если я изменю протокол с http на https , исключение не выдается, и я получу ожидаемый код ответа и содержимое с сервера. Я посмотрел на исходный код и могу следить за вызовами и отслеживать, где происходят исключения, но почему было бы нормально сделать такой запрос через HTTPS, а не HTTP?

1 Ответ

6 голосов
/ 01 февраля 2012

Это ограничение (я бы посчитал это ошибкой или, по крайней мере, глупой функцией) HttpURLConnection. Вы по крайней мере не единственный , кто сталкивается с этим при работе с веб-сервисами REST с использованием URLConnection.

Рассмотрите возможность использования Apache HttpComponents Client .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...