web-dev-qa-db-de.com

Wie sende ich eine HTTP-Anfrage in HTTP-Verbindung?

Ich möchte wissen, ob es möglich ist, die Anforderung PUT, DELETE (praktisch) über Java.net.HttpURLConnection an die HTTP-basierte URL zu senden.

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

121
Matrix

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-DELETE 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();
165
Matthew Murdoch

So hat es für mich funktioniert:

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

Ich stimme @adietisheim und dem Rest der Leute zu, die HttpClient vorschlagen.

Ich habe viel Zeit damit verbracht, einen einfachen Anruf zu machen, um sich mit HttpURLConnection auszuruhen. Das hatte mich nicht überzeugt und danach versuchte ich es mit HttpClient und es war wirklich einfacher, verständlicher und schöner.

Ein Beispiel für einen Code zum Put-Aufruf von http 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);
8
Alvaro

UrlConnection ist eine umständliche API, mit der gearbeitet werden kann. HttpClient ist bei weitem die bessere API und es erspart Ihnen, Zeit zu verlieren, um zu suchen, wie bestimmte Dinge zu erreichen sind, wie diese Stackoverflow-Frage perfekt veranschaulicht. Ich schreibe dies, nachdem ich die jdk HttpUrlConnection in mehreren REST -Clients verwendet habe ..__ Wenn es um Skalierbarkeitsfunktionen (wie Threadpools, Verbindungspools usw.) geht, ist HttpClient überlegen

3
adietisheim

Um einen PUT in HTML richtig 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();
}
3
Carlos Sirvent

es gibt eine einfache Methode zum Löschen und Einfügen von Anforderungen. Sie können dies einfach tun, indem Sie Ihrer Post-Anfrage einen Parameter "_method" hinzufügen und "PUT" oder "DELETE" als Wert eingeben!

0
Mohamad Rostami

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();
0
Gloria Rampur

Ich würde Apache HTTPClient empfehlen. 

0
Clint