2016-08-12 83 views
1

我試圖發送一個POST請求使用Plivo(VoIP服務器)發送短信到我的手機,但我剛收到BAD REQUEST(請求代碼400)。Android - HttpsURLConnection - BAD REQUEST

我收到的錯誤是"error": "invalid json data sent in raw POST"

我找不到在哪裏這是錯的。

有人可以幫助我嗎?

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

你用400獲得哪些額外的信息? –

+0

爲什麼不簡單地使用庫這樣的抽象,它真的讓事情變得更容易 – has19

+0

Plivo銷售工程師在這裏。 400響應將伴隨一個api_id和一個錯誤消息,它會告訴你爲什麼它不成功。如果您還有其他問題或者仍然無法解決問題,請聯繫[email protected]。 – CharlieC

回答

0

解決

當發送Json object,它必須被傳遞給String,但它不能被編碼。

修改行postParaEnvio.write(URLEncoder.encode(params.toString(), "UTF-8"));postParaEnvio.write(params.toString());解決了這個問題。

0

我認爲這可能會幫助你。 順便說一句,
我的依賴關係:gradle->
編譯 '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

是的。它有幫助。非常感謝你。 – GuiDupas