Chcę wiedzieć, czy możliwe jest wysłanie żądania PUT, DELETE (praktycznie) przez java.net.HttpURLConnection
adres URL oparty na HTTP.
Przeczytałem tak wiele artykułów opisujących, jak wysyłać żądania GET, POST, TRACE, OPTIONS, ale nadal nie znalazłem żadnego przykładowego kodu, który pomyślnie wykonuje żądania PUT i DELETE.
java
httpurlconnection
put
http-delete
Matryca
źródło
źródło
Odpowiedzi:
Aby wykonać 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();
Aby wykonać 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();
źródło
delete
. Kiedy uruchamiam ten kod tak, jak jest tutaj, tak naprawdę nic się nie dzieje, żądanie nie jest wysyłane. Taka sama sytuacja jest, gdy wykonujępost
żądania, ale mogę użyć na przykład tego,httpCon.getContent()
który wyzwala żądanie. Ale tohttpCon.connect()
nic nie uruchamia w mojej maszynie :-)Tak to działało u mnie:
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("DELETE"); int responseCode = connection.getResponseCode();
źródło
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; }
Następnie w swoim kodzie:
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 }
źródło
Zgadzam się z @adietisheim i resztą osób, które sugerują HttpClient.
Spędziłem czas próbując wykonać proste połączenie z usługą odpoczynku za pomocą HttpURLConnection i nie przekonało mnie to, a potem próbowałem z HttpClient i było to naprawdę łatwiejsze, zrozumiałe i przyjemne.
Przykład kodu do wykonania wywołania put http jest następujący:
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);
źródło
HttpURLConnection
do pracy, ale biegł do nieparzystej błędów, w szczególności:cannot retry due to server authentication, in streaming mode
. Postępowanie zgodnie z twoją radą zadziałało dla mnie. Zdaję sobie sprawę, że to nie do końca odpowiada na pytanie, które prosi o użycieHttpURLConnection
, ale Twoja odpowiedź mi pomogła.UrlConnection to niezręczny interfejs API do pracy. HttpClient jest zdecydowanie lepszym interfejsem API i pozwoli ci zaoszczędzić czas na szukaniu sposobów osiągnięcia pewnych rzeczy, takich jak to pytanie o przepływie stosu, które doskonale ilustruje. Piszę to po użyciu jdk HttpUrlConnection w kilku klientach REST. Ponadto, jeśli chodzi o funkcje skalowalności (takie jak pule wątków, pule połączeń itp.) HttpClient jest lepszy
źródło
Aby poprawnie wykonać PUT w HTML, musisz otoczyć go 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(); }
źródło
Nawet szablon odpoczynku może być opcją:
String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?<RequestDAO>...."; 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();
źródło
istnieje prosty sposób na usunięcie i umieszczenie żądania, możesz to po prostu zrobić, dodając
_method
parametr " " do żądania wiadomości i wpisując "PUT
" lub "DELETE
" dla jego wartości!źródło
Poleciłbym Apache HTTPClient.
źródło