Intereting Posts
DistanceBetween () возвращает неточный результат? Получить ключ от HashMap в Android по позиции или индексу Добавить элемент в ListView без перезагрузки Статистика приложений для Android на сетевом уровне пользователей Android / установлена Ожидаемый ресурс аниматора типа Позиционирование изображения внутри ImageView с помощью силы тяжести: верх Как отключить функцию вращения карты в фрагменте карты Android Как начать новую тему в сервисе? Java.lang.IllegalStateException: не удается выполнить это действие после onSaveInstanceState с помощью DialogFragment Список <String> readStringArray в Parcelable Как создать стиль Android с вкладками с просмотром страниц Swipe Я только что создал небольшой проект Android в Eclipse, какие файлы я должен добавить к управлению версиями? Как правильно обновить сообщение уведомления api 11? Работает ли Google Cloud Messaging (GCM) с Kindle Fire? Как отобразить одноразовый экран приветствия?

Как добавить параметры в HttpURLConnection с помощью POST

Я пытаюсь сделать POST с HttpURLConnection (я должен использовать его таким образом, не могу использовать HttpPost ), и я хотел бы добавить параметры к этому соединению, такие как

 post.setEntity(new UrlEncodedFormEntity(nvp)); 

где

 nvp = new ArrayList<NameValuePair>(); 

Имея некоторые данные, хранящиеся в. Я не могу найти способ, как добавить этот ArrayList к моему HttpURLConnection который находится здесь:

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

Причиной этого неудобного https и http-комбинации является необходимость проверки сертификата. Это не проблема, однако, он хорошо сообщает сервер. Но мне нужно это, чтобы опубликовать аргументы.

Есть идеи?

Solutions Collecting From Web of "Как добавить параметры в HttpURLConnection с помощью POST"

Вы можете получить выходной поток для соединения и написать строку запроса параметра к нему.

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

Поскольку NameValuePair устарел. Мысль о совместном использовании кода

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

Если вам не нужен параметр ArrayList<NameValuePair> для параметров, это более короткое решение, которое строит строку запроса с использованием класса 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(); 

Одним из решений является создание вашей собственной строки params, это фактический метод, который я использовал для моего последнего проекта, вам нужно изменить args from hashtable на namevaluepair's:

 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 params:

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

Надеюсь, эта помощь, кстати, это мой первый ответ, поэтому, если вы сочтете это полезным, пожалуйста, проголосуйте меня, THX.

Кажется, я нашел именно то, что вам нужно. Это может помочь другим.

Вы можете использовать метод 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) {} } 

Принятый ответ генерирует исключение ProtocolException:

OutputStream os = conn.getOutputStream();

Потому что он не позволяет выводить объект URLConnection. Решение должно включать следующее:

conn.setDoOutput(true);

Чтобы он работал.

Если еще не поздно, я хотел бы поделиться своим кодом

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... } } 

Существует гораздо более простой подход с использованием PrintWriter (см. Здесь )

В основном все, что вам нужно:

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

Попробуй это:

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

Вы можете добавить столько nameValuePairs сколько вам нужно. И не забудьте указать счет в списке.

AsyncTask для отправки данных как JSONObect через метод 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(); } 

Используя org.apache.http.client.HttpClient, вы можете легко сделать это с более читаемым способом, как показано ниже.

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

В пределах try catch вы можете вставить

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

Для вызова методов POST / PUT / DELETE / GET Restful с пользовательскими данными заголовка или json можно использовать следующий класс 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; } } 

И использование

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

Я использую что-то вроде этого:

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

В моем случае я создал такую ​​функцию, чтобы сделать запрос Post, который принимает строковый url и hashmap параметров

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

Вот как я передаю «params» (JSONObject) через POST

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