Wie sende ich eine PUT, DELETE HTTP-Anfrage in HttpURLConnection?

132

Ich möchte wissen, ob es möglich ist, eine PUT, DELETE-Anfrage (praktisch) java.net.HttpURLConnectionan eine HTTP-basierte URL zu senden .

Ich habe so viele Artikel gelesen, in denen beschrieben wird, wie GET-, POST-, TRACE- und OPTIONS-Anforderungen gesendet werden, aber ich habe immer noch keinen Beispielcode gefunden, der PUT- und DELETE-Anforderungen erfolgreich ausführt.

Matrix
quelle
2
Können Sie uns den Code zeigen, den Sie verwendet haben?
Akarnokd

Antworten:

177

So führen Sie einen HTTP-PUT durch:

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

So führen Sie ein HTTP-LÖSCHEN durch:

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();
Matthew Murdoch
quelle
1
Ja. All diese Dinge sind möglich, hängen jedoch wirklich von der API ab, die von Ihrem Mail- / Blog-Anbieter unterstützt wird.
Matthew Murdoch
5
Hallo, ich habe Probleme mit dem delete. Wenn ich diesen Code so ausführe, wie er hier ist, passiert nichts wirklich, die Anfrage wird nicht gesendet. Die gleiche Situation ist, wenn ich postAnfragen mache , aber dort kann ich zum Beispiel verwenden, httpCon.getContent()was die Anfrage auslöst. Aber das httpCon.connect()löst nichts in meiner Maschine aus :-)
coubeatczech
7
In den obigen Beispielen glaube ich, dass Sie am Ende httpCon.getInputStream () aufrufen müssen, damit die Anforderung tatsächlich gesendet wird.
Eric Smith
3
Ich habe "java.net.ProtocolException: DELETE unterstützt das Schreiben nicht"
Kimo_do
1
@edisusanto Die benannte Ressource (angegeben durch die URL) sind die Daten, die gelöscht werden.
Matthew Murdoch
24

So hat es bei mir funktioniert:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
int responseCode = connection.getResponseCode();
Eli Heifetz
quelle
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;
}

Dann in Ihrem Code:

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
}
Benjamin Twilight
quelle
Abrufen von 'java.io.IOException: nicht unterstützte Methode: put' inJ2me sdk logger
CodeToLife
8

Ich stimme @adietisheim und den anderen Leuten zu, die HttpClient vorschlagen.

Ich habe einige Zeit damit verbracht, mit HttpURLConnection einen einfachen Anruf zu tätigen, um mich auszuruhen, und es hatte mich nicht überzeugt. Danach habe ich es mit HttpClient versucht und es war wirklich einfacher, verständlicher und netter.

Ein Beispiel für Code zum Ausführen eines http-Aufrufs lautet wie folgt:

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);
Alvaro
quelle
Ich wollte mich nur dafür bedanken. Ich habe viele Stunden damit verbracht, meinen Code HttpURLConnectionzum Laufen zu bringen, bin aber immer wieder auf einen seltsamen Fehler gestoßen, insbesondere : cannot retry due to server authentication, in streaming mode. Ihrem Rat zu folgen hat bei mir funktioniert. Mir ist klar, dass dies nicht genau die Frage beantwortet, die verwendet werden soll HttpURLConnection, aber Ihre Antwort hat mir geholfen.
Tom Catullo
@ Veraltet verwenden Sie stattdessen HttpClientBuilder
Waldemar Wosiński
3

UrlConnection ist eine umständliche API, mit der man arbeiten kann. HttpClient ist bei weitem die bessere API und erspart Ihnen Zeitverlust bei der Suche, wie bestimmte Dinge erreicht werden können, wie diese Frage zum Stapelüberlauf perfekt zeigt. Ich schreibe dies, nachdem ich die jdk HttpUrlConnection in mehreren REST-Clients verwendet habe. Darüber hinaus ist HttpClient in Bezug auf Skalierbarkeitsfunktionen (wie Threadpools, Verbindungspools usw.) überlegen

adietisheim
quelle
3

Um einen PUT in HTML korrekt auszuführen, müssen Sie ihn mit try / catch umgeben:

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();
}
Carlos Sirvent
quelle
1

Sogar Rest Template kann eine Option sein:

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();
Gloria Rampur
quelle
Dies ist eine der besten Antworten, die ich auf SO gesehen habe.
Thonnor
0

Es gibt eine einfache Möglichkeit zum Löschen und Einfügen von Anfragen. Sie können dies einfach tun, indem Sie _methodIhrer Post-Anfrage einen " " -Parameter hinzufügen und " PUT" oder " DELETE" für ihren Wert schreiben !

Mohamad Rostami
quelle
-1

Ich würde Apache HTTPClient empfehlen.

Clint
quelle
9
Warum würden Sie HTTPClient empfehlen? Es ist riesig. Ich meine - in der Größe.
Jayarjo
1
@ Jayarjo, es ist Teil des Android SDK.
Zamel
9
@Zamel: Wo genau kommt Android ins Bild?
Talonx
1
@ Talonx: Ich habe keine Ahnung. Mein Fehler. Ich wurde in der Android-Entwicklung begraben, daher die Verwirrung.
Zamel
3
Wenn das OP klar sagte, dass HttpUrlConnection verwendet werden sollte, warum dann HttpClient verwenden?
Weiß nicht viel