Estoy tratando de enviar una solicitud POST usando Plivo (servidor VoIP) para enviar un SMS a mi teléfono celular, pero acabo de recibir UNA SOLICITUD MALA (Código de solicitud 400).

El error que recibí es "error": "invalid json data sent in raw POST"

No encuentro dónde está mal.

¿Alguien puede ayudarme?

        final AsyncTask<String, Void, Boolean> request = new AsyncTask<String, Void, Boolean>() {

            @Override
            protected Boolean doInBackground(String... strings) {

                Boolean retorno = true;

                HttpsURLConnection request = null;
                try {
                    request = (HttpsURLConnection) finalUrl.openConnection();

                    System.out.println("Define POST");
                    request.setRequestMethod("POST");
                    request.setUseCaches(false);
                    request.setDoOutput(true);

                    System.out.println("Define propriedades");
                    request.setRequestProperty("Content-Type", "application/json");
                    request.setRequestProperty("Accept", "application/json");
                    request.setRequestProperty("Accept-Charset", "UTF-8");
                    request.setRequestProperty("charset", "UTF-8");

                    System.out.println("Define autenticação");
                    String autenticacao = authID + ":" + authToken;
                    String basic = "Basic " + new String(Base64.encode(autenticacao.getBytes(), Base64.NO_WRAP));
                    request.setRequestProperty("Authorization", basic);

                    System.out.println("Define parâmetros");
                    JSONObject params = new JSONObject();
                    params.put("dst", numeroDestino);
                    params.put("src", numeroOrigem);
                    params.put("text", body);

                    System.out.println("Faz conexão e requisição");
                    request.connect();
                    OutputStreamWriter postParaEnvio = new OutputStreamWriter(request.getOutputStream());
                    postParaEnvio.write(URLEncoder.encode(params.toString(), "UTF-8"));
                    postParaEnvio.flush();
                    postParaEnvio.close();

                    int codigoStatus = request.getResponseCode();

                    for (Map.Entry<String, List<String>> header : request.getHeaderFields().entrySet()) {
                        System.out.println(header.getKey() + "=" + header.getValue());
                    }

                    if (codigoStatus == 202) {
                        System.out.println("OK");
                    } else {
                        System.out.println("Falha");
                        System.out.println(codigoStatus);

                        retorno = false;
                    }

                } catch (IOException e) {
                    System.out.println("Falha Exception");
                    e.printStackTrace();

                    retorno = false;
                } catch (JSONException e) {
                    e.printStackTrace();

                    retorno = false;
                } finally {

                    request.disconnect();
                }

                return retorno;
            }

            @Override
            protected void onPostExecute(Boolean result) {

                indicadorDeAtividade.dismiss();

                if(result) {

                } else {
                    mostrarErro(0, R.string.erroEnviarCodigo);
                }
            }
        }.execute();
1
GuiDupas 12 ago. 2016 a las 23:08

2 respuestas

La mejor respuesta

Resuelto

Al enviar Json object, debe pasarse a String pero no se puede codificar.

Modificar la línea postParaEnvio.write(URLEncoder.encode(params.toString(), "UTF-8")); a postParaEnvio.write(params.toString()); resolvió el problema.

0
GuiDupas 17 ago. 2016 a las 13:30

Creo que esto puede ayudarte. Por cierto,
Mis dependencias: gradle->
compila 'com.android.support:appcompat-v7:23.4.0'

   class BackGround extends AsyncTask<String, String, String> {

    protected String doInBackground(String... params) {
        String name = params[0];
        String password = params[1];
        String email = params[2];
        String phone=params[3];

        String data="";
        int tmp;

        try {
            URL url = new URL("http://domain.com/yourFile.php");
            String urlParams = "name="+name+"&password="+password+"&email="+email+"&phone="+phone;

            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setDoOutput(true);
            OutputStream os = httpURLConnection.getOutputStream();
            os.write(urlParams.getBytes());
            os.flush();
            os.close();
            InputStream is = httpURLConnection.getInputStream();
            while((tmp=is.read())!=-1){
                data+= (char)tmp;
            }
            is.close();
            httpURLConnection.disconnect();
            return data;

        } catch (MalformedURLException e) {
            e.printStackTrace();
            return "Exception: "+e.getMessage();
        } catch (IOException e) {
            e.printStackTrace();
            return "Exception: "+e.getMessage();
        }
    }

    @Override
    protected void onPostExecute(String s) {
        if(s.equals("")){
            s="Data Saved! Success...";
        }
        Toast.makeText(ctx, s, Toast.LENGTH_LONG).show();
    }
}
0
aemre 17 ago. 2016 a las 14:21