如何使用POST将参数添加到HttpURLConnection
我正在尝试使用HttpURLConnection
POST (我需要这样使用它,不能使用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组合的原因是需要不validation证书。 这不是一个问题,但是,它很好地张贴服务器。 但我需要它与论点发表。
有任何想法吗?
您可以获取连接的输出stream,并将参数查询string写入它。
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>
,这是一个较短的解决scheme,它使用Uri.Builder
类来构build查询string:
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();
一种解决scheme是创build自己的paramsstring,这是我用于最新项目的实际方法,您需要将哈希表从哈希表更改为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()));
希望这个帮助,顺便说一句,这是我的第一个答案,所以如果你觉得有用的请投我,thx。
我想我find了你需要的东西。 它可以帮助别人。
您可以使用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对象的输出。 解决scheme应该包括这个:
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();
尝试这个:
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
通过POST
方法将数据作为JSONObect
发送
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);
要使用自定义标题或json数据调用POST / PUT / DELETE / GET Restful方法,可以使用以下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); ......
在我的情况下,我已经创build了这样的function,使Post请求,其中参数的String 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(); }
这是我通过POST传递“params”(JSONObject)的方式
connection.getOutputStream().write(params.toString().getBytes("UTF-8"));