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.


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

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

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
}

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

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


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

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

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!


-1

Eu recomendaria o Apache HTTPClient.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.