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

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

GET, POST, TRACE, OPTIONS 요청을 보내는 방법을 설명하는 많은 기사를 읽었지만 여전히 PUT 및 DELETE 요청을 성공적으로 수행하는 샘플 코드를 찾지 못했습니다.



답변

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


답변

이것이 나를 위해 일한 방법입니다.

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
int responseCode = connection.getResponseCode();


답변

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
}


답변

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


답변

UrlConnection은 다루기 어려운 API입니다. HttpClient는 훨씬 나은 API 이며이 stackoverflow 질문과 같은 특정 항목을 완벽하게 보여주는 방법을 찾는 시간을 낭비하지 않아도됩니다. 여러 REST 클라이언트에서 jdk HttpUrlConnection을 사용한 후에 이것을 작성합니다. 또한 확장 기능 (스레드 풀, 연결 풀 등)과 관련하여 HttpClient가 우수합니다.


답변

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


답변

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

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