HUTpURLConnection में PUT, DELETE HTTP अनुरोध कैसे भेजें?


132

मैं जानना चाहता हूं कि क्या java.net.HttpURLConnectionHTTP-आधारित URL के माध्यम से PUT, DELETE अनुरोध (व्यावहारिक रूप से) भेजना संभव है ।

मैंने बहुत सारे लेख पढ़े हैं जिसमें बताया गया है कि GET, POST, TRACE, OPTIONS अनुरोध कैसे भेजें लेकिन मुझे अभी भी कोई नमूना कोड नहीं मिला है जो सफलतापूर्वक PUT और DELETE अनुरोध करता है।


2
क्या आप हमें उस कोड को दिखा सकते हैं जिसे आपने उपयोग करने की कोशिश की है?
एकरनोकड

जवाबों:


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
हाँ। ये सभी चीजें संभव हैं लेकिन वास्तव में आपके मेल / ब्लॉग प्रदाता द्वारा समर्थित एपीआई पर निर्भर करती हैं।
मैथ्यू मर्डोक

5
हैलो, मुझे परेशानी हो रही है delete। जब मैं इस कोड को चलाता हूं जैसा कि यहां है, तो वास्तव में कुछ भी नहीं होता है, अनुरोध नहीं भेजा जाता है। समान स्थिति तब है जब मैं postअनुरोध कर रहा हूं , लेकिन वहां मैं उदाहरण के लिए उपयोग कर सकता हूं httpCon.getContent()जो अनुरोध को ट्रिगर करता है। लेकिन httpCon.connect()मेरी मशीन में कुछ भी ट्रिगर नहीं करता है :-)
Coubeatceshop

7
ऊपर दिए गए उदाहरणों में, मेरा मानना ​​है कि वास्तव में अनुरोध भेजने के कारण आपको httpCon.getInputStream () को कॉल करना होगा।
एरिक स्मिथ

3
मुझे "java.net.ProtocolException मिली: DELETE लेखन का समर्थन नहीं करता"
किमो_दो

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, लेकिन आपके जवाब से मुझे मदद मिली।
टॉम कैटुलो

@Deprecated इसके स्थान पर HttpClientBuilder का उपयोग करें
Waldemar Wosiński

3

UrlConnection के साथ काम करने के लिए एक अजीब एपीआई है। HttpClient अब तक बेहतर एपीआई है और यह आपको समय की खोज करने से रोकता है कि इस स्टैकओवरफ्लो प्रश्न की तरह कुछ चीजों को कैसे प्राप्त किया जाए। मैं कई 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();

यह सबसे अच्छा जवाब मैं SO पर देखा है में से एक है।
थनोर

0

हटाने और अनुरोध करने का एक सरल तरीका है, आप इसे _methodअपने पोस्ट अनुरोध में " " पैरामीटर जोड़कर कर सकते हैं और इसके मूल्य के लिए " PUT" या " DELETE" लिख सकते हैं !


-1

मैं अपाचे HTTPClient की सिफारिश करूंगा।


9
आप HTTPClient की सिफारिश क्यों करेंगे? यह बहुत बड़ा है। मेरा मतलब है - आकार में।
जयरोज़ो

1
@ संजारो, यह एंड्रॉइड एसडीके का हिस्सा है।
ज़ेलल

9
@Zamel: एंड्रॉइड वास्तव में तस्वीर कहां दर्ज करता है?
टैलोनक्स

1
@talonx: मुझे कोई पता नहीं है। मेरी गलती। मुझे एंड्रॉइड विकास में दफन किया गया था इसलिए भ्रम।
ज़मेल

3
जब ओपी ने स्पष्ट रूप से कहा कि HttpUrlConnection का उपयोग किया जाना चाहिए, तो HttpClient का उपयोग क्यों करें?
नहीं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.