Cómo agregar parámetros a HttpURLConnection usando POST usando NameValuePair

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

tener algunos datos almacenados en. No puedo encontrar la 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); 

El motivo de esa combinación incómoda de https y http es la necesidad de no verificar el certificado. Eso no es un problema, sin embargo, publica bien el servidor. Pero necesito que publique con argumentos.

¿Algunas ideas?


Exención de responsabilidad duplicada:

En 2012, no tenía idea de cómo se insertaban los parámetros en una solicitud HTTP POST . Estaba NameValuePair a NameValuePair porque estaba en un tutorial. Esta pregunta puede parecer un duplicado, sin embargo, mi auto 2012 leí esa otra pregunta y NO estaba usando NameValuePair . De hecho, no resolvió mi problema.

Puede obtener el flujo de salida para la conexión y escribirle la cadena de consulta de parámetro.

 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 params = new ArrayList(); 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 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á en desuso. Pensamiento de compartir mi código

 public String performPostCall(String requestURL, HashMap 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 params) throws UnsupportedEncodingException{ StringBuilder result = new StringBuilder(); boolean first = true; for(Map.Entry 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 para los parámetros, esta es una solución más corta que crea 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 tu propia cadena params.

Este es el método real que he estado usando para mi último proyecto. Necesita cambiar args de hashtable a namevaluepair’s:

 private static String getPostParamString(Hashtable params) { if(params.size() == 0) return ""; StringBuffer buf = new StringBuffer(); Enumeration 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 params:

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

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

Puede usar 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 arroja una ProtocolException en:

OutputStream os = conn.getOutputStream();

porque no habilita la salida para el objeto URLConnection. La solución debe incluir esto:

conn.setDoOutput(true);

para hacer 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 { @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 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 usando 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 postPatwigters = "param1=value1&param2=value2" urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length); PrintWriter out = new PrintWriter(urlConnection.getOutputStream()); out.print(postParameters); out.close(); // connect urlConnection.connect(); 

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

 public class PostMethodDemo extends AsyncTask { 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(); } 

Prueba esto:

 HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("your url"); List nameValuePairs = new ArrayList(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 olvides mencionar el conteo en la lista.

Al usar org.apache.http.client.HttpClient también puede hacer esto fácilmente con la forma más legible que se muestra a continuación.

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

Dentro de la captura de try puedes insertar

 // Add your data List nameValuePairs = new ArrayList(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 encabezado o json personalizados, se puede usar la siguiente clase Async.

 public class HttpUrlConnectionUtlity extends AsyncTask { 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 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 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 getHeaderMap() { return headerMap; } public void setHeaderMap(HashMap 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 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 una función como esta para hacer Post request que toma String url y hashmap de parámetros

  public String postRequest( String mainUrl,HashMap parameterList) { String response=""; try { URL url = new URL(mainUrl); StringBuilder postData = new StringBuilder(); for (Map.Entry 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(); } 

así es como paso “params” (JSONObject) a través de POST

 connection.getOutputStream().write(params.toString().getBytes("UTF-8"));