2016-01-01 4 views
0

Я отправляю параметры POST в своем приложении для Android, однако ни один из них не получен сервером (request().body().asFormUrlEncoded() в Play Framework возвращает пустую карту). Вот код AsyncTask, используемый для отправки запроса:HttpURLConnection не отправляет данные POST (Android)

private static AsyncTask<String, Void, String> register = new AsyncTask<String, Void, String>() { 
     @Override 
     protected String doInBackground(String... params) { 
      String email = params[0], username = params[1], password = params[2]; 
      try { 
       URL    url = new URL(REGISTER); 
       HttpURLConnection conn; 
       conn = (HttpURLConnection)url.openConnection(); 
       conn.setDoOutput(true); 
       String   urlParams  = URLEncoder.encode("username=" + username + "&email=" + email + "&password=" + password, "UTF-8"); 
       conn.setRequestMethod("POST"); 
       conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       conn.setRequestProperty("Content-Length", String.valueOf(urlParams.length())); 
       conn.connect(); 
       OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); 
       writer.write(urlParams); 
       writer.flush(); 
       writer.close(); 

       int resp = conn.getResponseCode(); 
       Object content = conn.getContent(); 
       conn.disconnect(); 
       if(resp != 200) 
        return ERROR + "Bad response: " + resp + ", ";// + conn.getContent(); 
       return content.toString(); 
      } catch (IOException e) { 
       System.out.println("IOException occurred: "); 
       e.printStackTrace(); 
       return ERROR + e.getMessage(); 
      } 
     } 
    }; 

я планирую сделать что-то покрасивее, но мне нужно, чтобы сделать эту работу первым. Каждый ответ до сих пор предлагал что-то, что я уже сделал (например, connect(), установив Content-Length, закрыв Writer после завершения, получив ответ), и он все еще не работает. Соединение принимается сервером, но тело пуст и сервер возвращает 400.

+0

Возможно, вам придется кодировать отдельные значения параметров (и ключи параметров). –

+0

Вы уверены, что вам нужно кодировать параметры POST? Обычно это требуется только для параметров GET. –

+0

Не кодирующие параметры решили это, но теперь я еще более озадачен, почему это так? С другой стороны, если я не кодирую params, я не могу разрешить '&' (и другие символы со специальным значением) в любом из полей или мне нужно их закодировать вручную. – Luke

ответ

2

Вам не нужно ни устанавливать длину контента, ни позвонить connect(): они оба автоматические. Но вам нужно установить контент типа через API, а не через свойство request. В противном случае он будет перезаписан по умолчанию по умолчанию API, поэтому исправление не было исправлено.

+0

Как вы устанавливаете тип контента через API и не запрашиваете свойство? – ShrimpCrackers