Как добавить параметры с помощью HttpURLConnection Post использование NameValuePair
Я пытаюсь сделать 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 является необходимость не проверка сертификат. Это не проблема, однако, он хорошо отправляет сервер. Но мне нужно его опубликовать с аргументами.
какие идеи?
Дубликат Отказ От Ответственности:
еще в 2012 году, я понятия не имел, как параметры были вставлены в HTTP POST запрос. Я держался за NameValuePair
потому что это было в учебнике. Этот вопрос может показаться дубликатом, однако, мой 2012 self прочитал это другое вопрос и был не используя NameValuePair
. На самом деле это не решило мою проблему.
15 ответов:
вы можете получить выходной поток для соединения и записать в него строку запроса параметра.
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();
одним из решений является создание собственной строки параметров.
это фактический метод, который я использовал для моего последнего проекта. Вам нужно изменить аргументы из хеш-таблицы в 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(); }
размещение параметров:
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(getPostParamString(req.getPostParams()));
Я думаю, что нашел именно то, что вам нужно. Это может помочь другим.
вы можете использовать метод 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¶m2=value2" urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length); PrintWriter out = new PrintWriter(urlConnection.getOutputStream()); out.print(postParameters); out.close(); // connect urlConnection.connect();
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(); }
попробуйте это:
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
Как вам нужно. И не забудьте упомянуть счет в списке.
С помощью org.апаш.http.клиент.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 можно использовать следующий асинхронный класс
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; }