WebService Delete- DELETE does not support writing

2 respostas
E

Estou desenvolvendo um client para acessar websevice DELETE , porém esta dando erro de :

java.net.ProtocolException: DELETE does not support writing

Estou utilizando o POSTMAIN, retorna status 200.

segue abaixo o meu código:

Client Android:

public void apagarWebServiceDelete(Long id) {
    try {
        URL url;
        HttpURLConnection connection = null;
        //Create connection
        url = new URL("http://192.168.0.120:8081/WebServiceAndroid/web/" + id);

        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("DELETE");
        connection.setRequestProperty("Content-Type",
                "application/json");
        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setConnectTimeout(30000);
        //Send request
        DataOutputStream wr = new DataOutputStream(
                connection.getOutputStream());
        wr.flush();
        wr.close();

        //Get Response
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer response = new StringBuffer();
        while ((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
        }
        rd.close();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Código do Server:

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public Response deletaPessoas(@PathVariable Long id) {
	if(true) {
		return Response.Ok("Carro deletado com sucesso");
	} else {
		return Response.Error("Erro ao deletar carro");
	}
	
}

2 Respostas

B

Boa tarde,

Pesquisei um pouco e achei um problema parecido com o seu no stackoverflow.com, o problema seria na linha “connection.setDoOutput(true);”, removendo esta linha o problema se resolveria.

Segundo a documentação do Android, esse método adiciona um payload a requisição. Porém, segundo a especificação do HTTP não existe uma definição semântica para este payload no método DELETE e não foi definido o comportamento deste método quando a requisição o inclui, logo em algumas implementações do HTTP, sua requisição poderá ser rejeitada.

Provavelmente deve ser o seu caso.

E

consegui resolver dessa forma:

public String doDelete(String url, Map<String, String> params, String charset) throws IOException {
 /*   String queryString = getQueryString(params);
    if (queryString != null && queryString.trim().length() > 0) {
        url += "?" + queryString;
    }*/
    url += "/5";
    if (LOG_ON) {
        Log.d(TAG, ">> Http.doDelete: " + url);
    }

    URL u = new URL(url);
    HttpURLConnection conn = null;
    String s = null;
    try {
        conn = (HttpURLConnection) u.openConnection();
        if (contentType != null) {
            conn.setRequestProperty("Content-Type", contentType);
        }
        conn.setRequestMethod("DELETE");
        conn.setConnectTimeout(TIMEOUT_MILLIS);
        conn.setReadTimeout(TIMEOUT_MILLIS);

        conn.connect();
        InputStream in = conn.getInputStream();
        s = IOUtils.toString(in, charset);
        if (LOG_ON) {
            Log.d(TAG, "<< Http.doGet: " + s);
        }
        in.close();
    } catch (IOException e) {
        throw e;
    } finally {
        if (conn != null) {
            conn.disconnect();
        }
    }

    return s;
}
Criado 18 de abril de 2016
Ultima resposta 18 de abr. de 2016
Respostas 2
Participantes 2