讲这个之前,我们先来说说get和post两种请求的区别吧!!!

    1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.

    2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

    3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

    4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码

区别是不是已经很清楚啦,就是get请求的数据是放在一个url的后面发给服务器的,有长度限制,而post则是放在一个实体中,打包发给服务器,长度没有限制。废话不多说,直接上代码,代码中有注释。

一、Post以Json方式传值

(客户端代码):方法传入的参数为name和password.

HttpParams params = new BasicHttpParams();//创建一个参数对象,用来存储设置的各个参数
	HttpProtocolParams.setContentCharset(params, "UTF-8");// 设置消息所用的字符集
	HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1);//设置http协议版本
	ConnManagerParams.setTimeout(params, 1000);//从连接池中取连接的超时时间
	//ConnManagerParams.setMaxTotalConnections(params, 200);//设置整个连接池最大连接数 ,即总并行链接最大数(根据自己的需求而定)

	//ConnPerRoute connPerRoute = new ConnPerRouteBean(100);//每台主机的最大并行链接数(根据自己的需求而定)
	//ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);//每台主机的最大并行链接数(根据自己的需求而定)
	HttpConnectionParams.setConnectionTimeout(params, 5000);// 设置连接超时时间
	HttpConnectionParams.setSoTimeout(params, 5000);// 设置服务器响应超时时间
	//设置HttpClient支持HTTp和HTTPS两种协议
        SchemeRegistry schReg = new SchemeRegistry();
        schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));//http协议默认端口是80
        schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));//https协议默认端口是443
        //使用线程安全的连接管理来创建HttpClient
        ClientConnectionManager conman = new ThreadSafeClientConnManager(params, schReg);
	HttpClient client = new DefaultHttpClient(conman, params);//创建一个发送请求的客户端
	HttpPost post = new HttpPost(URL);//创建Post请求对象
	//----------------------------以JSON方式请求-----------------------
	JSONObject jsonObj = new JSONObject();//创建一个json对象
	jsonObj.put("name", name);//把name值放入json对象中
	jsonObj.put("password", password);//把password放入json对象中
	NameValuePair info = new BasicNameValuePair("login", jsonObj.toString());//把json对象放入一个NameValuePair中,并指定key值,服务端通过这个key值获取我们的json对象
	List<NameValuePair> parameters = new ArrayList<NameValuePair>();//创建一个集合,存NameValuePair对象的
	parameters.add(info);//把NameValuePair对象添加至集合中
	post.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8"));//把这个封装好需要发送数据的集合放进post请求的实体中
	HttpResponse response = client.execute(post);//执行post请求,即把数据发给服务器
	if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//通过返回的响应对象来得到状态行,从状态行中再得到状态码,判断连接服务器成功没

		//Header head = response.getFirstHeader("Date");//通过获取响应的头部来获取响应时间或者其它信息
		//String dateStr = head.getValue();//得到响应时间
		//Log.i("zxy", head.getName()+"----"+dateStr);//输出的是Date----Mon, 09 Feb 2015 08:53:14 GMT

		//-------------------服务器发来JSON数据的解析-----------------
		HttpEntity entity = response.getEntity();//通过返回的响应对象得到服务器返回的消息实体,服务器返回的消息都打包在这个实体中
		String responseStr = EntityUtils.toString(entity, "UTF-8");//把实体转化为String字符串,因为服务器是以json形式返回的数据,所以字符串格式是json格式的
		JSONObject responseJsonObj = new JSONObject(responseStr);//通过json格式的字符串得到该返回实体的json对象
		boolean result = responseJsonObj.getBoolean("json");//得到服务器返回的数据key对应的值,和上面的name和password的key一样的效果,服务器也要返回key值给客户端获取数据
		if(result){
			mHandler.sendEmptyMessage(USERLOGIN_SUCCESS);//android消息管理机制,发送消息给消息管理器用来更新UI
		}else{
			mHandler.sendEmptyMessage(USERLOGIN_FAILED);
		}

		client.getConnectionManager().shutdown();//关闭连接,释放资源
	}

(服务端代码):

我用的是servlet:
         public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	 }

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//----------------响应返回JSON数据--------------
		request.setCharacterEncoding("UTF-8");//把接收到的请求数据以UTF-8编码格式编码
		String requestStr = request.getParameter("login");//得到key值为login的json数据字符串,该字符串值为{"password":"123456","name":"admin"}
		JSONObject jsonObj = JSONObject.fromObject(requestStr); //得到这个json格式字符串的json对象
		System.out.println(jsonObj);//结果为{"password":"123456","name":"admin"}
		String name = jsonObj.getString("name");//得到jsonObj对象中key值为name的数据
		String password = jsonObj.getString("password");
		if(name.equals("admin")&&password.equals("123456")){//业务逻辑处理,我这里只是简单的做了个判断,真正的项目应该要从数据库中判断是否有该用户名和密码
			response.setCharacterEncoding("UTF-8");//设置返回消息的编码方式
			JSONObject responseJsonObj = new JSONObject();//创建一个json对象
			responseJsonObj.put("json", true);//返回一个boolean类型的值,key为json,客户端通过这个key来获取服务器返回的值
			System.out.println(responseJsonObj);//结果为{"json":true}
			//response.getWriter().write(responseJsonObj.toString());//这种方式就是得到response的字符串输出流,用来输出字符串,即返回字符串给客户端
		response.getOutputStream().write(responseJsonObj.toString().getBytes("UTF-8"));//这种方式是得到字节流,可以用来返回任何类型的数据
		}else{
			response.setCharacterEncoding("UTF-8");
			JSONObject responseJsonObj = new JSONObject();
			responseJsonObj.accumulate("json", false);
			System.out.println("responseJsonObj="+responseJsonObj);
			response.getWriter().write(responseJsonObj.toString());
		}

	}

二、Post以普通参数方式向服务器传值,实质就是根据NameValuePair对象来传的。

(客户端代码):这个就更简洁了,简单易懂有木有。。。
HttpParams params = new BasicHttpParams();//创建一个参数对象,用来存储设置的各个参数
		HttpProtocolParams.setContentCharset(params, "UTF-8");// 设置消息所用的字符集
		HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1);//设置http协议版本
		ConnManagerParams.setTimeout(params, 1000);//从连接池中取连接的超时时间
		//ConnManagerParams.setMaxTotalConnections(params, 200);//设置整个连接池最大连接数 ,即总并行链接最大数(根据自己的需求而定)

		//ConnPerRoute connPerRoute = new ConnPerRouteBean(100);//每台主机的最大并行链接数(根据自己的需求而定)
		//ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);//每台主机的最大并行链接数(根据自己的需求而定)
		HttpConnectionParams.setConnectionTimeout(params, 5000);// 设置连接超时时间
		HttpConnectionParams.setSoTimeout(params, 5000);// 设置服务器响应超时时间
		//设置HttpClient支持HTTp和HTTPS两种协议
		 SchemeRegistry schReg = new SchemeRegistry();
		 schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));//http协议默认端口是80
		schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));//https协议默认端口是443
		//使用线程安全的连接管理来创建HttpClient
		 ClientConnectionManager conman = new ThreadSafeClientConnManager(params, schReg);
		HttpClient client = new DefaultHttpClient(conman, params);//创建一个发送请求的客户端
		HttpPost post = new HttpPost(URL);//创建Post请求对象
		//------------普通post请求--------
		NameValuePair loginName = new BasicNameValuePair("name", name);//把要发送的数据封装在NameValuePair对象中,并设置键值
		NameValuePair loginPassword = new BasicNameValuePair("password",password);
		List<NameValuePair> parameters = new ArrayList<NameValuePair>();
		parameters.add(loginName);//把数据添加到集合中
		parameters.add(loginPassword);
		post.setEntity(new UrlEncodedFormEntity(parameters,"UTF-8"));//把该集合打包成实体对象放入post对象中
		//---------------------------
		HttpResponse response = client.execute(post);//执行post请求,即把数据发给服务器
		if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//通过返回的响应对象来得到状态行,从状态行中再得到状态码,判断连接服务器成功没

			//Header head = response.getFirstHeader("Date");//通过获取响应的头部来获取响应时间或者其它信息
			//String dateStr = head.getValue();//得到响应时间
			//Log.i("zxy", head.getName()+"----"+dateStr);//输出的是Date----Mon, 09 Feb 2015 08:53:14 GMT
		//---------------普通响应处理------------
			HttpEntity entity = response.getEntity();
			String responseStr = EntityUtils.toString(entity, "UTF-8");//得到服务器返回的对象转为字符串
			if (responseStr.equals("ok")) {
				mHandler.sendEmptyMessage(USERLOGIN_SUCCESS);
			} else {
				mHandler.sendEmptyMessage(USERLOGIN_FAILED);
			}
			client.getConnectionManager().shutdown();//关闭连接,释放资源


(服务端代码)servlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
					throws ServletException, IOException {
				this.doPost(request, response);
		}
		public void doPost(HttpServletRequest request, HttpServletResponse response)
					throws ServletException, IOException {
		//----------------普通方式响应客户端------------
		request.setCharacterEncoding("UTF-8");
		String loginName = request.getParameter("name");//得到NameValuePair对象对应key的值
		String loginPassword = request.getParameter("password");
		response.setCharacterEncoding("UTF-8");//设置返回消息的编码方式
		if(name.equals("admin")&&password.equals("123456")){//业务逻辑处理,我这里只是简单的做了个判断,真正的项目应该要从数据库中判断是否有该用户名和密码
			//response.getWriter().write("ok");//这种方式就是得到response的字符串输出流,用来输出字符串,即返回字符串给客户端
			response.getOutputStream().write("ok".getBytes("UTF-8"));//这种方式是得到字节流,可以用来返回任何类型的数据
		}else{
			response.getOutputStream().write("no".getBytes("UTF-8"));//这种方式是得到字节流,可以用来返回任何类型的数据
		}
	}


是不是很容易呀!!!

三、顺便补充一下,HttpClient以Get方式发送请求的方法
直接上代码吧,区别我开始已经讲的很清楚了~
(客户端代码):
public void loginGet(String name, String password) {
			HttpParams params = new BasicHttpParams();// 创建一个参数对象,用来存储设置的各个参数
			HttpProtocolParams.setContentCharset(params, "UTF-8");// 设置消息所用的字符集
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);// 设置http协议版本
			ConnManagerParams.setTimeout(params, 1000);// 从连接池中取连接的超时时间
			// ConnManagerParams.setMaxTotalConnections(params, 200);//设置整个连接池最大连接数,即总并行链接最大数(根据自己的需求而定)

			// ConnPerRoute connPerRoute = new
			// ConnPerRouteBean(100);//每台主机的最大并行链接数(根据自己的需求而定)
			// ConnManagerParams.setMaxConnectionsPerRoute(params,
			// connPerRoute);//每台主机的最大并行链接数(根据自己的需求而定)
			HttpConnectionParams.setConnectionTimeout(params, 5000);// 设置连接超时时间
			HttpConnectionParams.setSoTimeout(params, 5000);// 设置服务器响应超时时间
			// 设置HttpClient支持HTTp和HTTPS两种协议
			SchemeRegistry schReg = new SchemeRegistry();
			schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));// http协议默认端口是80
			schReg.register(new Scheme("https",SSLSocketFactory.getSocketFactory(), 443));// https协议默认端口是443
			// 使用线程安全的连接管理来创建HttpClient
			ClientConnectionManager conman = new ThreadSafeClientConnManager(params, schReg);
			//——————————以Get方式请求服务器——————————————
			HttpClient client = new DefaultHttpClient(conman, params);
			String URL = "http://192.168.1.105:8080/KYDServer/servlet/Login?name="+name+"&password="+password;//只需要把参数拼接到url中即可
			HttpGet get = new HttpGet(URL);//创建Get请求对象
			HttpResponse response = client.execute(get);//执行Get请求
			HttpEntity entity = response.getEntity();
			String result = EntityUtils.toString(entity, "UTF-8");
			if(result.equals("ok")){
				mHandler.sendEmptyMessage(USERLOGIN_SUCCESS);
			}
				client.getConnectionManager().shutdown();
			}


(服务端代码):

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	 }

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//----------------普通方式响应客户端------------
		request.setCharacterEncoding("UTF-8");
		String loginName = request.getParameter("name");//获取URL中对应名称的值
		String loginPassword = request.getParameter("password");
   		response.setCharacterEncoding("UTF-8");//设置返回消息的编码方式
		if(name.equals("admin")&&password.equals("123456")){//业务逻辑处理,我这里只是简单的做了个判断,真正的项目应该要从数据库中判断是否有该用户名和密码
			//response.getWriter().write("ok");//这种方式就是得到response的字符串输出流,用来输出字符串,即返回字符串给客户端
			response.getOutputStream().write("ok".getBytes("UTF-8"));//这种方式是得到字节流,可以用来返回任何类型的数据
		}else{

                        //response.getWriter().write("no");//这种方式就是得到response的字符串输出流,用来输出字符串,即返回字符串给客户端
			response.getOutputStream().write("no".getBytes("UTF-8"));//这种方式是得到字节流,可以用来返回任何类型的数据

		}

	}

其实Get请求不安全,几乎很少用它,都是用Post请求来做客户端和服务端的连接。。。



【注】:以上代码只是为了叙述HttpClient连接服务器的方式,具体捕获异常没有写,相关代码也没有优化,还有,HttpClient连接可以写成单例模式,来保证在一个app中只有一个HttpClient。HttpClient中还有连接池的方法,android现有的api不支持这个,要使用必须去apache官网下载HttpClient4.3的jar包导入即可。




Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)的更多相关文章

  1. Android使用HttpUrlConnection请求服务器发送数据详解

    HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...

  2. Android - 向服务器发送数据(POST) - HTTPClient.

    该篇文章主要说明使用Apache提供的HTTPClient,通过post方式,向服务器发送数据.由于有些东西在 Android - 向服务器发送数据(GET)中提到过,就不再重复. 一,Android ...

  3. Android - 向服务器发送数据(GET).

    在此,使用HTTP协议,通过GET请求,向服务器发送请求,这种方式适合于数据量小,数据安全性要求不高的情况下. 一,服务器端,使用Servlet. 在服务器端,定义一个HttpServlet的子类,以 ...

  4. 使用post()方法以POST方式从服务器发送数据

    使用post()方法以POST方式从服务器发送数据 与get()方法相比,post()方法多用于以POST方式向服务器发送数据,服务器接收到数据之后,进行处理,并将处理结果返回页面,调用格式如下: $ ...

  5. C语言Socket-单工通信(客户端向服务器发送数据)

    服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.li ...

  6. Android请求服务器的两种方式--post, get的区别

    android中用get和post方式向服务器提交请求_疯狂之桥_新浪博客http://blog.sina.com.cn/s/blog_a46817ff01017yxt.html Android提交数 ...

  7. ICE学习第四步-----客户端请求服务器返回数据

    这次我们来做一个例子,流程很简单:客户端向服务器发送一条指令,服务端接收到这条指令之后,向客户端发送数据库中查询到的数据,最终显示在DataGridView上. 根据上一篇文章介绍的Slice语法,我 ...

  8. node中一个基本的HTTP客户端向本地的HTTP服务器发送数据

    上一篇讲到了node可以轻松的向其他请求数据. 这一篇就来讲讲向本地服务器的数据交互. HTTP服务器代码,s.js var http=require("http"); var s ...

  9. android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结

    常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在 ...

随机推荐

  1. [NOI 2015]软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生. 通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖 ...

  2. 关于非旋转treap的学习

    非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...

  3. ●BZOJ 3622 已经没有什么好害怕的了

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3622 题解: 容斥,dp1).可以求出需要多少对"糖果>药片"(K ...

  4. bzoj2338[HNOI2011]数矩形 计算几何

    2338: [HNOI2011]数矩形 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1535  Solved: 693[Submit][Status ...

  5. bzoj1767[Ceoi2009]harbingers 斜率优化dp

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 112[Submit][S ...

  6. bzoj2753[SCOI2012]滑雪与时间胶囊 最小生成树

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2843  Solved: 993[Submit][Status][Discuss] Descripti ...

  7. 腾讯笔试题:小Q硬币组合

    腾讯有一道机试题: 大概意思是: 小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2, ...

  8. C语言程序设计作业

    一.阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 我期望老师与学生之间的关系是和睦相处的,学生有问题可以找老师,当然是再老师有空的条件下.老师和学生 ...

  9. Spring之定时器(QuartzJobBean)的实现

      需求:做个分配任务的功能模块,在任务截止前的十五分钟进行提醒(发送邮件.短信.系统提醒).每隔五分钟提醒一次,直到任务完成! 想法:刚开始是想着是不是可以做个监听器,监听截止时间.当时间到了开始进 ...

  10. 安装插件出现eclipse An internal error occurred during: "Installing Software". xxxxxxxxx

    就是你自己本来就有那个插件了 百度怎么删吧.... 看一下我这个文章 强烈建议本地安装的时候用第四种安装 http://www.cnblogs.com/ydymz/articles/7203260.h ...