Android Http方法:Get请求与Post请求的区别及实例示范

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


 

 

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值