Cómo agregar parámetros a HttpURLConnection mediante POST

Estoy tratando de hacer POST con HttpURLConnection (Necesito usarlo de esta manera, no puedo usar HttpPost ) y me gustaría agregar parámetros a esa conexión como

 post.setEntity(new UrlEncodedFormEntity(nvp)); 

dónde

 nvp = new ArrayList<NameValuePair>(); 

Tener algunos datos almacenados en. No puedo encontrar una manera de agregar este ArrayList a mi HttpURLConnection que está aquí:

 HttpsURLConnection https = (HttpsURLConnection) url.openConnection(); https.setHostnameVerifier(DO_NOT_VERIFY); http = https; http.setRequestMethod("POST"); http.setDoInput(true); http.setDoOutput(true); 

La razón de esa combinación torpe de https y http es la necesidad de no verificar el certificado. Eso no es un problema, sin embargo, publica el servidor también. Pero lo necesito para publicar con argumentos.

¿Algunas ideas?

Puede obtener flujo de salida para la conexión y escribir la cadena de consulta de parámetros.

 URL url = new URL("http://yoururl.com"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("firstParam", paramValue1)); params.add(new BasicNameValuePair("secondParam", paramValue2)); params.add(new BasicNameValuePair("thirdParam", paramValue3)); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(getQuery(params)); writer.flush(); writer.close(); os.close(); conn.connect(); 

 private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (NameValuePair pair : params) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(pair.getName(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(pair.getValue(), "UTF-8")); } return result.toString(); } 

Dado que NameValuePair está obsoleto. Pensamiento de compartir mi código

 public String performPostCall(String requestURL, HashMap<String, String> postDataParams) { URL url; String response = ""; try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode=conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { String line; BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); while ((line=br.readLine()) != null) { response+=line; } } else { response=""; } } catch (Exception e) { e.printStackTrace(); } return response; } 

….

  private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException{ StringBuilder result = new StringBuilder(); boolean first = true; for(Map.Entry<String, String> entry : params.entrySet()){ if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } return result.toString(); } 

Si no necesita ArrayList<NameValuePair> para los parámetros, esta es una solución más corta que genera la cadena de consulta utilizando la clase Uri.Builder :

 URL url = new URL("http://yoururl.com"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); Uri.Builder builder = new Uri.Builder() .appendQueryParameter("firstParam", paramValue1) .appendQueryParameter("secondParam", paramValue2) .appendQueryParameter("thirdParam", paramValue3); String query = builder.build().getEncodedQuery(); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(query); writer.flush(); writer.close(); os.close(); conn.connect(); 

Una solución es hacer su propia cadena de params, este es el método real que he estado usando para mi último proyecto, necesita cambiar args de hashtable a namevaluepair:

 private static String getPostParamString(Hashtable<String, String> params) { if(params.size() == 0) return ""; StringBuffer buf = new StringBuffer(); Enumeration<String> keys = params.keys(); while(keys.hasMoreElements()) { buf.append(buf.length() == 0 ? "" : "&"); String key = keys.nextElement(); buf.append(key).append("=").append(params.get(key)); } return buf.toString(); } 

POSTing los parámetros:

 OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(getPostParamString(req.getPostParams())); 

Espero que esta ayuda, por cierto esta es mi primera respuesta, por lo que si usted encuentra útil por favor votar a mí, thx.

Creo que encontré exactamente lo que necesitas. Puede ayudar a otros.

Puede utilizar el método UrlEncodedFormEntity.writeTo (OutputStream) .

 UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nvp); http.connect(); OutputStream output = null; try { output = http.getOutputStream(); formEntity.writeTo(output); } finally { if (output != null) try { output.close(); } catch (IOException ioe) {} } 

La respuesta aceptada lanza un ProtocolException en:

OutputStream os = conn.getOutputStream();

Porque no habilita la salida para el objeto URLConnection. La solución debe incluir lo siguiente:

conn.setDoOutput(true);

Para que funcione.

Si no es demasiado tarde, me gustaría compartir mi código

Utils.java:

 public static String buildPostParameters(Object content) { String output = null; if ((content instanceof String) || (content instanceof JSONObject) || (content instanceof JSONArray)) { output = content.toString(); } else if (content instanceof Map) { Uri.Builder builder = new Uri.Builder(); HashMap hashMap = (HashMap) content; if (hashMap != null) { Iterator entries = hashMap.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = (Map.Entry) entries.next(); builder.appendQueryParameter(entry.getKey().toString(), entry.getValue().toString()); entries.remove(); // avoids a ConcurrentModificationException } output = builder.build().getEncodedQuery(); } } return output; } public static URLConnection makeRequest(String method, String apiAddress, String accessToken, String mimeType, String requestBody) throws IOException { URL url = new URL(apiAddress); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoInput(true); urlConnection.setDoOutput(!method.equals("GET")); urlConnection.setRequestMethod(method); urlConnection.setRequestProperty("Authorization", "Bearer " + accessToken); urlConnection.setRequestProperty("Content-Type", mimeType); OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream()); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8")); writer.write(requestBody); writer.flush(); writer.close(); outputStream.close(); urlConnection.connect(); return urlConnection; } 

MainActivity.java:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new APIRequest().execute(); } private class APIRequest extends AsyncTask<Void, Void, String> { @Override protected Object doInBackground(Void... params) { // Of course, you should comment the other CASES when testing one CASE // CASE 1: For FromBody parameter String url = "http://10.0.2.2/api/frombody"; String requestBody = Utils.buildPostParameters("'FromBody Value'"); // must have '' for FromBody parameter HttpURLConnection urlConnection = null; try { urlConnection = (HttpURLConnection) Utils.makeRequest("POST", url, null, "application/json", requestBody); InputStream inputStream; // get stream if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) { inputStream = urlConnection.getInputStream(); } else { inputStream = urlConnection.getErrorStream(); } // parse stream BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String temp, response = ""; while ((temp = bufferedReader.readLine()) != null) { response += temp; } return response; } catch (IOException e) { e.printStackTrace(); return e.toString(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } // CASE 2: For JSONObject parameter String url = "http://10.0.2.2/api/testjsonobject"; JSONObject jsonBody; String requestBody; HttpURLConnection urlConnection; try { jsonBody = new JSONObject(); jsonBody.put("Title", "BNK Title"); jsonBody.put("Author", "BNK"); jsonBody.put("Date", "2015/08/08"); requestBody = Utils.buildPostParameters(jsonBody); urlConnection = (HttpURLConnection) Utils.makeRequest("POST", url, null, "application/json", requestBody); ... // the same logic to case #1 ... return response; } catch (JSONException | IOException e) { e.printStackTrace(); return e.toString(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } // CASE 3: For form-urlencoded parameter String url = "http://10.0.2.2/api/token"; HttpURLConnection urlConnection; Map<String, String> stringMap = new HashMap<>(); stringMap.put("grant_type", "password"); stringMap.put("username", "username"); stringMap.put("password", "password"); String requestBody = Utils.buildPostParameters(stringMap); try { urlConnection = (HttpURLConnection) Utils.makeRequest("POST", url, null, "application/x-www-form-urlencoded", requestBody); ... // the same logic to case #1 ... return response; } catch (Exception e) { e.printStackTrace(); return e.toString(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } } @Override protected void onPostExecute(String response) { super.onPostExecute(response); // do something... } } 

Hay un enfoque mucho más fácil con PrintWriter (ver aquí )

Básicamente todo lo que necesitas es:

 // set up URL connection URL urlToRequest = new URL(urlStr); HttpURLConnection urlConnection = (HttpURLConnection)urlToRequest.openConnection(); urlConnection.setDoOutput(true); urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // write out form parameters String postParamaters = "param1=value1&param2=value2" urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length); PrintWriter out = new PrintWriter(urlConnection.getOutputStream()); out.print(postParameters); out.close(); // connect urlConnection.connect(); 

Prueba esto:

 HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("your url"); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); nameValuePairs.add(new BasicNameValuePair("user_name", "Name")); nameValuePairs.add(new BasicNameValuePair("pass","Password" )); nameValuePairs.add(new BasicNameValuePair("user_email","email" )); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request HttpResponse response = httpclient.execute(httppost); String ret = EntityUtils.toString(response.getEntity()); Log.v("Util response", ret); 

Puede agregar tantos nameValuePairs como necesite. Y no olvide mencionar el recuento en la lista.

AsyncTask para enviar datos como JSONObect través del método POST

 public class PostMethodDemo extends AsyncTask<String , Void ,String> { String server_response; @Override protected String doInBackground(String... strings) { URL url; HttpURLConnection urlConnection = null; try { url = new URL(strings[0]); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.setRequestMethod("POST"); DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream ()); try { JSONObject obj = new JSONObject(); obj.put("key1" , "value1"); obj.put("key2" , "value2"); wr.writeBytes(obj.toString()); Log.e("JSON Input", obj.toString()); wr.flush(); wr.close(); } catch (JSONException ex) { ex.printStackTrace(); } urlConnection.connect(); int responseCode = urlConnection.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK){ server_response = readStream(urlConnection.getInputStream()); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Log.e("Response", "" + server_response); } } public static String readStream(InputStream in) { BufferedReader reader = null; StringBuffer response = new StringBuffer(); try { reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { response.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return response.toString(); } 

Mediante el uso de org.apache.http.client.HttpClient también puede hacer esto fácilmente con una forma más legible como a continuación.

 HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); 

Dentro de try catch puede insertar

 // Add your data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("id", "12345")); nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!")); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request HttpResponse response = httpclient.execute(httppost); 

Para llamar a los métodos POST / PUT / DELETE / GET Restful con datos de cabecera o json personalizados se puede utilizar la siguiente clase Async

 public class HttpUrlConnectionUtlity extends AsyncTask<Integer, Void, String> { private static final String TAG = "HttpUrlConnectionUtlity"; Context mContext; public static final int GET_METHOD = 0, POST_METHOD = 1, PUT_METHOD = 2, HEAD_METHOD = 3, DELETE_METHOD = 4, TRACE_METHOD = 5, OPTIONS_METHOD = 6; HashMap<String, String> headerMap; String entityString; String url; int requestType = -1; final String timeOut = "TIMED_OUT"; int TIME_OUT = 60 * 1000; public HttpUrlConnectionUtlity (Context mContext) { this.mContext = mContext; this.callback = callback; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(Integer... params) { int requestType = getRequestType(); String response = ""; try { URL url = getUrl(); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection = setRequestMethod(urlConnection, requestType); urlConnection.setConnectTimeout(TIME_OUT); urlConnection.setReadTimeout(TIME_OUT); urlConnection.setDoOutput(true); urlConnection = setHeaderData(urlConnection); urlConnection = setEntity(urlConnection); if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { response = readResponseStream(urlConnection.getInputStream()); Logger.v(TAG, response); } urlConnection.disconnect(); return response; } catch (ProtocolException e) { e.printStackTrace(); } catch (SocketTimeoutException e) { return timeOut; } catch (IOException e) { e.printStackTrace(); } catch (IllegalStateException e) { Logger.e(TAG, "ALREADY CONNECTED"); } return response; } @Override protected void onPostExecute(String response) { super.onPostExecute(response); if (TextUtils.isEmpty(response)) { //empty response } else if (response != null && response.equals(timeOut)) { //request timed out } else { //process your response } } private String getEntityString() { return entityString; } public void setEntityString(String s) { this.entityString = s; } private String readResponseStream(InputStream in) { BufferedReader reader = null; StringBuffer response = new StringBuffer(); try { reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { response.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return response.toString(); } private HttpURLConnection setEntity(HttpURLConnection urlConnection) throws IOException { if (getEntityString() != null) { OutputStream outputStream = urlConnection.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); writer.write(getEntityString()); writer.flush(); writer.close(); outputStream.close(); } else { Logger.w(TAG, "NO ENTITY DATA TO APPEND ||NO ENTITY DATA TO APPEND ||NO ENTITY DATA TO APPEND"); } return urlConnection; } private HttpURLConnection setHeaderData(HttpURLConnection urlConnection) throws UnsupportedEncodingException { urlConnection.setRequestProperty("Content-Type", "application/json"); urlConnection.setRequestProperty("Accept", "application/json"); if (getHeaderMap() != null) { for (Map.Entry<String, String> entry : getHeaderMap().entrySet()) { urlConnection.setRequestProperty(entry.getKey(), entry.getValue()); } } else { Logger.w(TAG, "NO HEADER DATA TO APPEND ||NO HEADER DATA TO APPEND ||NO HEADER DATA TO APPEND"); } return urlConnection; } private HttpURLConnection setRequestMethod(HttpURLConnection urlConnection, int requestMethod) { try { switch (requestMethod) { case GET_METHOD: urlConnection.setRequestMethod("GET"); break; case POST_METHOD: urlConnection.setRequestMethod("POST"); break; case PUT_METHOD: urlConnection.setRequestMethod("PUT"); break; case DELETE_METHOD: urlConnection.setRequestMethod("DELETE"); break; case OPTIONS_METHOD: urlConnection.setRequestMethod("OPTIONS"); break; case HEAD_METHOD: urlConnection.setRequestMethod("HEAD"); break; case TRACE_METHOD: urlConnection.setRequestMethod("TRACE"); break; } } catch (ProtocolException e) { e.printStackTrace(); } return urlConnection; } public int getRequestType() { return requestType; } public void setRequestType(int requestType) { this.requestType = requestType; } public URL getUrl() throws MalformedURLException { return new URL(url); } public void setUrl(String url) { this.url = url; } public HashMap<String, String> getHeaderMap() { return headerMap; } public void setHeaderMap(HashMap<String, String> headerMap) { this.headerMap = headerMap; } } 

Y el uso es

  HttpUrlConnectionUtlity httpMethod = new HttpUrlConnectionUtlity (mContext); JSONObject jsonEntity = new JSONObject(); try { jsonEntity.put("key1", value1); jsonEntity.put("key2", value2); } catch (JSONException e) { e.printStackTrace(); } httpMethod.setUrl(YOUR_URL_STRING); HashMap<String, String> headerMap = new HashMap<>(); headerMap.put("key",value); headerMap.put("key1",value1); httpMethod.setHeaderMap(headerMap); httpMethod.setRequestType(WiseConnectHttpMethod.POST_METHOD); //specify POST/GET/DELETE/PUT httpMethod.setEntityString(jsonEntity.toString()); httpMethod.execute(); 

Yo uso algo como esto:

  .... SchemeRegistry sR = new SchemeRegistry(); sR.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); HttpParams params = new BasicHttpParams(); SingleClientConnManager mgr = new SingleClientConnManager(params, sR); HttpClient httpclient = new DefaultHttpClient(mgr, params); HttpPost httppost = new HttpPost(url); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); ...... 

En mi caso he creado la función como esta para hacer la petición del poste que toma el URL de la secuencia y el hashmap de parámetros

  public String postRequest( String mainUrl,HashMap<String,String> parameterList) { String response=""; try { URL url = new URL(mainUrl); StringBuilder postData = new StringBuilder(); for (Map.Entry<String, String> param : parameterList.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); } byte[] postDataBytes = postData.toString().getBytes("UTF-8"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); conn.setDoOutput(true); conn.getOutputStream().write(postDataBytes); Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuilder sb = new StringBuilder(); for (int c; (c = in.read()) >= 0; ) sb.append((char) c); response = sb.toString(); return response; }catch (Exception excep){ excep.printStackTrace();} return response; } 
 JSONObject params = new JSONObject(); try { params.put(key, val); }catch (JSONException e){ e.printStackTrace(); } 

Esto es cómo pasar "params" (JSONObject) a través de POST

 connection.getOutputStream().write(params.toString().getBytes("UTF-8")); 
  • phonegap android ajax solicita trabajo para GET pero no POST
  • problema POST android JSONObject a PHP
  • Volley - solicitud de http en bloqueo
  • No se pudo escribir la solicitud: no se encontró HttpMessageConverter adecuado para el tipo de solicitud y el tipo de contenido
  • HttpURLConnection Post: El flujo de salida no tiene efecto?
  • ¿Cómo enviar un objeto JSON sobre solicitud con Android?
  • Iniciar sesión en el sitio web
  • Publicar en Ruby on Rails la aplicación de android
  • Solicitud de publicación de Android en IOS
  • Android StringBody (String) está obsoleto
  • ¿Cómo hacer http post usando apache httpclient con autenticación web?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.