Http方法:Get请求与Post请求的区别
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求
Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改
Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。
Get传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的。
GET请求的数据会被浏览器缓存起来,用户名和密码将明文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。在服务器端,用Request.QueryString来获取Get方式提交来的数据
Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。
Post比Get安全:
当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址.
对于敏感数据和不是中文字符的数据,则用post,POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据只能用Request.Form来获取
原文来自:http://www.douban.com/note/180488791/
推荐文章:http://hxraid.iteye.com/blog/457003
以下例子:
1.GET:
void GetDate() {
// URL
String uriAPI = "http://172.0.0.0:8082/TestServelt/login";
String idString = "110";
String nameString = "cyy";
String url = uriAPI + "?" + "id=" + idString + "&name=" + nameString;
HttpGet get = new HttpGet(url);
HttpClient client = new DefaultHttpClient();
try {
HttpResponse response = client.execute(get);// 执行Post方法
String resultString = EntityUtils.toString(response.getEntity());//得到结果
} catch (Exception e) {
}
}
2.POST:
方式一:HttpPost
代码如下:
class AsyncHttpPost extends AsyncTask<Object, Object, String> {
@Override
protected String doInBackground(Object... param) {
/* 建立HTTP Post连线 */
HttpPost httpRequest = new HttpPost(uriAPI);
// Post运作传送变数必须用NameValuePair[]阵列储存
// 传参数 服务端获取的方法为request.getParameter("name")
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", "cyy"));
params.add(new BasicNameValuePair("pwd", "1234"));
try {
// 发出HTTP request
httpRequest.setEntity(new UrlEncodedFormEntity(params,
HTTP.UTF_8));
// 取得HTTP response
HttpResponse httpResponse = new DefaultHttpClient()
.execute(httpRequest);
// 若状态码为200 ok
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 取出回应字串
String strResult = EntityUtils.toString(httpResponse
.getEntity());
return strResult;
} else {
return "Error Response"
+ httpResponse.getStatusLine().toString();
}
} catch (ClientProtocolException e) {
return e.getMessage().toString();
} catch (UnsupportedEncodingException e) {
return e.getMessage().toString();
} catch (IOException e) {
return e.getMessage().toString();
}
}
@Override
protected void onPostExecute(String result) {
tv.setText(result);
}
}
方式二:HttpURLConnection
代码如下:
class AsyncHttpURL extends AsyncTask<Object, Object, String> {
@Override
protected String doInBackground(Object... params) {
try {
// 建立连接
URL url = new URL(uriAPI);
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
httpConn.setConnectTimeout(5 * 1000);
httpConn.setReadTimeout(10 * 1000);
// //设置连接属性
// 设置是否向connection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true
httpConn.setDoOutput(true);
// 使用 URL 连接进行输入, Default is true.
httpConn.setDoInput(true);
// Post 请求不能使用缓存,忽略缓存
httpConn.setUseCaches(false);
// 是成员函数,仅作用于当前函数
httpConn.setInstanceFollowRedirects(true);
// 设置URL请求方法, Default is GET
httpConn.setRequestMethod("POST");
// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
// 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode进行编码
httpConn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded;charset=UTF-8");
// 编码方式,上面设置了charset=UTF-8,这里就不用设置了
httpConn.setRequestProperty("Charset", "UTF-8");
// 维持长连接
httpConn.setRequestProperty("Connection", "Keep-Alive");
// 要注意的是connection.getOutputStream会隐含的进行connect。
httpConn.connect();
DataOutputStream out = new DataOutputStream(
httpConn.getOutputStream());
// The URL-encoded contend
// 正文,正文内容其实跟get的URL中'?'后的参数字符串一致,传多参请看下面方法
String content = "name="+ URLEncoder.encode("cyy", "utf-8");
// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面
out.writeBytes(content);
out.flush();
out.close();
BufferedReader reader = new BufferedReader(
new InputStreamReader(httpConn.getInputStream()));
StringBuilder sb = new StringBuilder();
String lineTxt = null;
while ((lineTxt = reader.readLine()) != null) {
sb.append(lineTxt);
}
reader.close();
httpConn.disconnect();
return sb.toString();
} catch (Exception ex) {
ex.printStackTrace();
return ex.toString();
}
}
@Override
protected void onPostExecute(String result) {
tv.setText(result);
}
}
NameValuePair转换String方法:
/** NameValuePair转换String */
private String getReqString(List<? extends NameValuePair> params) {
// 正文,正文内容其实跟get的URL中'?'后的参数字符串一致
StringBuffer req = new StringBuffer("");
if (null != params && !params.isEmpty()) {
NameValuePair pair;
pair = params.get(0);
try {
req.append(pair.getName() + "="
+ URLEncoder.encode(pair.getValue(), "utf-8"));
for (int i = 1; i < params.size(); i++) {
pair = params.get(i);
req.append("&" + pair.getName() + "="
+ URLEncoder.encode(pair.getValue(), "utf-8"));
}
} catch (UnsupportedEncodingException e) {
}
}
return req.toString();
}
代码下载:svn:http://code.taobao.org/svn/httprequest/trunk