HttpURLConnection에서 PUT, DELETE HTTP 요청을 보내는 방법은 무엇입니까?


132

PUT, DELETE 요청을 (실제로) java.net.HttpURLConnectionHTTP 기반 URL 로 보낼 수 있는지 알고 싶습니다 .

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에 따라 다릅니다.
Matthew Murdoch

5
안녕하세요,에 문제가 있습니다 delete. 이 코드를 여기에서 실행하면 실제로 아무 일도 일어나지 않으며 요청이 전송되지 않습니다. post요청을 할 때와 같은 상황 이지만 요청 httpCon.getContent()을 트리거하는 예 를 사용할 수 있습니다 . 그러나 httpCon.connect()내 컴퓨터에서 아무것도 트리거하지 않습니다 :-)
coubeatczech

7
위의 예제에서 요청을 실제로 보내려면 끝에 httpCon.getInputStream ()을 호출해야한다고 생각합니다.
Eric Smith

3
"java.net.ProtocolException : DELETE는 쓰기를 지원하지 않습니다."
Kimo_do

1
명명 된 리소스 (URL로 표시)는 @edisusanto가 삭제 될 데이터입니다.
Matthew Murdoch

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
}

J2me SDK 로거에서 'java.io.IOException : 지원되지 않는 메소드 : put'가져 오기
CodeToLife

8

@adietisheim 및 HttpClient를 제안하는 다른 사람들과 동의합니다.

나는 HttpURLConnection으로 서비스를 휴식시키기 위해 간단한 호출을 시도하는 데 시간을 보냈고 그것을 확신하지 못했고 그 후에 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

@Deprecated 대신 HttpClientBuilder 사용
Waldemar Wosiński

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

나머지 템플릿조차도 옵션이 될 수 있습니다.

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

이것은 내가 본 최고의 답변 중 하나입니다.
thonnor

0

삭제 및 넣기 요청에 대한 간단한 방법 _method이 있습니다. 게시 요청에 " "매개 변수를 추가하고 해당 값으로 " PUT"또는 " DELETE"를 쓰면됩니다 .


-1

Apache HTTPClient를 권장합니다.


9
왜 HTTPClient를 추천 하시겠습니까? 거대합니다. 내 말은-크기입니다.
jayarjo

1
@jayarjo, 그것은 안드로이드 SDK의 일부입니다.
Zamel

9
@ 자멜 : 안드로이드는 어디에 사진을 정확하게 입력합니까?
talonx

1
@talonx : 나는 모른다. 내 실수. 나는 안드로이드 개발에 묻혀서 혼란을 겪었다.
Zamel

3
OP가 HttpUrlConnection을 사용해야한다고 분명히 말하면 왜 HttpClient를 사용해야합니까?
많이 알지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.