Como enviar uma solicitação HTTP PUT, DELETE em HttpURLConnection?

132

Quero saber se é possível enviar solicitação PUT, DELETE (praticamente) através java.net.HttpURLConnectionde URL baseada em HTTP.

Li muitos artigos descrevendo como enviar solicitações GET, POST, TRACE, OPTIONS, mas ainda não encontrei nenhum código de exemplo que execute com êxito solicitações PUT e DELETE.

Matriz
fonte
2
Você pode nos mostrar o código que tentou usar?
26610 akarnokd

Respostas:

177

Para executar um 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();

Para executar um 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();
Matthew Murdoch
fonte
1
Sim. Tudo isso é possível, mas realmente depende da API suportada pelo seu provedor de email / blog.
Matthew Murdoch
5
Olá, estou tendo problemas com o delete. Quando executo esse código como está aqui, nada realmente acontece, a solicitação não é enviada. A mesma situação é quando estou fazendo postsolicitações, mas lá posso usar, por exemplo, o httpCon.getContent()que aciona a solicitação. Mas a httpCon.connect()não desencadear qualquer coisa na minha máquina :-)
coubeatczech
7
Nos exemplos acima, acredito que você precisará chamar httpCon.getInputStream () no final para fazer com que a solicitação seja realmente enviada.
Eric Smith
3
Eu recebi "java.net.ProtocolException: DELETE não suporta gravação"
Kimo_do 4/04/2013
1
@edisusanto o recurso nomeado (indicado pelo URL) são os dados que serão excluídos.
Matthew Murdoch
24

É assim que funcionou para mim:

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

Então no seu código:

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
fonte
Obtendo 'java.io.IOException: Método não suportado: put' logger inJ2me SDK
CodeToLife
8

Concordo com @adietisheim e o resto das pessoas que sugerem o HttpClient.

Passei um tempo tentando fazer uma simples chamada para descansar no serviço com o HttpURLConnection e isso não me convenceu; depois disso, tentei com o HttpClient e ficou muito mais fácil, compreensível e agradável.

Um exemplo de código para fazer uma chamada http colocada é o seguinte:

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
fonte
Só queria dizer obrigado por isso. Passei muitas horas a tentar obter o meu código usando HttpURLConnectionao trabalho, mas continuou correndo em um erro estranho, especificamente: cannot retry due to server authentication, in streaming mode. Seguir o seu conselho funcionou para mim. Sei que isso não responde exatamente à pergunta, que pede para ser usada HttpURLConnection, mas sua resposta me ajudou.
Tom Catullo
@Deprecated use HttpClientBuilder em vez disso
Waldemar Wosiński
3

UrlConnection é uma API estranha para trabalhar. O HttpClient é, de longe, a melhor API e poupará o seu tempo a pesquisar como conseguir certas coisas como esta pergunta de stackoverflow ilustra perfeitamente. Escrevo isso depois de ter usado o jdk HttpUrlConnection em vários clientes REST. Além disso, quando se trata de recursos de escalabilidade (como conjuntos de threads, conjuntos de conexões etc.), o HttpClient é superior

adietisheim
fonte
3

Para fazer um PUT em HTML corretamente, você precisará cercá-lo com 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();
}
Carlos Sirvent
fonte
1

Mesmo modelo de descanso pode ser uma opção:

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
fonte
Esta é uma das melhores respostas que eu já vi no SO.
thonnor
0

existe uma maneira simples de excluir e colocar solicitação, basta fazê-lo adicionando um _methodparâmetro " " à sua solicitação de postagem e escrevendo " PUT" ou " DELETE" pelo seu valor!

Mohamad Rostami
fonte
-1

Eu recomendaria o Apache HTTPClient.

Clint
fonte
9
Por que você recomendaria o HTTPClient? É enorme. Quero dizer - em tamanho.
Jayarjo #
1
@jayarjo, faz parte do Android SDK.
Zamel 30/08/11
9
@Zamel: Onde exatamente o Android entra em cena?
talonx
1
@talonx: Não faço ideia. Meu erro. Eu estava enterrado no desenvolvimento do Android, daí a confusão.
Zamel
3
Quando o OP disse claramente que HttpUrlConnection deve ser usado, por que usar HttpClient?
Sabe Not Much