HttpURLConnectionでPUT、DELETE HTTPリクエストを送信する方法


132

PUT、DELETEリクエストを(実際に)java.net.HttpURLConnectionHTTPベースのURL に送信できるかどうかを知りたいです。

GET、POST、TRACE、OPTIONSリクエストを送信する方法を説明した記事をたくさん読みましたが、PUTおよびDELETEリクエストを正常に実行するサンプルコードはまだ見つかりません。


2
使用しようとしたコードを見せていただけますか?
akarnokd 2009年

回答:


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()を呼び出す必要があると思います。
Eric Smith、

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:unsupported method:put' inJ2me sdk logger
CodeToLife

8

@adietisheimおよびHttpClientを提案する他の人々に同意します。

私はHttpURLConnectionを使用してRESTサービスを呼び出す単純な呼び出しを試みるのに時間を費やしましたが、それでも確信が持てず、その後HttpClientを試しましたが、それは本当に簡単で、理解しやすく、便利でした。

put 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ますが、あなたの答えが私を助けてくれました。
Tom Catullo、2016年

@非推奨代わりにHttpClientBuilderを使用してください
WaldemarWosiński'10 / 08/17

3

UrlConnectionは扱いにくいAPIです。HttpClientははるかに優れたAPIであり、このStackoverflowの質問が完全に例示するような特定のことを達成する方法を探す時間を失うことからあなたを解放します。これは、いくつかのRESTクライアントでjdk HttpUrlConnectionを使用した後に記述しています。さらに、スケーラビリティ機能(スレッドプール、接続プールなど)に関しては、HttpClientが優れています。


3

HTMLでPUTを正しく行うには、それを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

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で見た中で最高の答えの1つです。
thonnor

0

削除および要求を送信する簡単な方法があり_methodます。「」パラメーターを投稿要求に追加し、その値に「PUT」または「DELETE」を書き込むだけで実行できます。


-1

Apache HTTPClientをお勧めします。


9
なぜHTTPClientを勧めますか?それは巨大です。つまり、サイズです。
jayarjo

1
@jayarjo、これはAndroid SDKの一部です。
ザメル

9
@Zamel:Androidは正確にどこに入るのですか?
talonx 2012年

1
@talonx:わからない。私の間違い。私はAndroid開発に埋もれてしまったため、混乱が生じました。
Zamel

3
OPがHttpUrlConnectionを使用する必要があることを明確に言ったとき、なぜHttpClientを使用するのですか?
あまり知らない
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.