Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
讲这个之前,我们先来说说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();//关闭连接,释放资源 }
(服务端代码):
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();//关闭连接,释放资源
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"));//这种方式是得到字节流,可以用来返回任何类型的数据 } }
是不是很容易呀!!!
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请求来做客户端和服务端的连接。。。
Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)的更多相关文章
- Android使用HttpUrlConnection请求服务器发送数据详解
HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...
- Android - 向服务器发送数据(POST) - HTTPClient.
该篇文章主要说明使用Apache提供的HTTPClient,通过post方式,向服务器发送数据.由于有些东西在 Android - 向服务器发送数据(GET)中提到过,就不再重复. 一,Android ...
- Android - 向服务器发送数据(GET).
在此,使用HTTP协议,通过GET请求,向服务器发送请求,这种方式适合于数据量小,数据安全性要求不高的情况下. 一,服务器端,使用Servlet. 在服务器端,定义一个HttpServlet的子类,以 ...
- 使用post()方法以POST方式从服务器发送数据
使用post()方法以POST方式从服务器发送数据 与get()方法相比,post()方法多用于以POST方式向服务器发送数据,服务器接收到数据之后,进行处理,并将处理结果返回页面,调用格式如下: $ ...
- C语言Socket-单工通信(客户端向服务器发送数据)
服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.li ...
- Android请求服务器的两种方式--post, get的区别
android中用get和post方式向服务器提交请求_疯狂之桥_新浪博客http://blog.sina.com.cn/s/blog_a46817ff01017yxt.html Android提交数 ...
- ICE学习第四步-----客户端请求服务器返回数据
这次我们来做一个例子,流程很简单:客户端向服务器发送一条指令,服务端接收到这条指令之后,向客户端发送数据库中查询到的数据,最终显示在DataGridView上. 根据上一篇文章介绍的Slice语法,我 ...
- node中一个基本的HTTP客户端向本地的HTTP服务器发送数据
上一篇讲到了node可以轻松的向其他请求数据. 这一篇就来讲讲向本地服务器的数据交互. HTTP服务器代码,s.js var http=require("http"); var s ...
- android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结
常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在 ...
随机推荐
- [Luogu 3674]小清新人渣的本愿
Description 题库链接 给你一个序列 \(A\) ,长度为 \(n\) ,有 \(m\) 次操作,每次询问一个区间是否可以 选出两个数它们的差为 \(x\) : 选出两个数它们的和为 \(x ...
- [NOIp 2014]飞扬的小鸟
Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉 ...
- [JLOI 2011]飞行路线&[USACO 09FEB]Revamping Trails
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- [HNOI2007]分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- 灰狼呼唤着同胞(brethren)
先求出确定边的联通块,有cnt块,显然方案数为2^(cnt-1) 联通块用dfs很好求 但此题还有并查集解法,且与一道叫团伙的题很像 边为0为敌人,1为朋友,敌人的敌人是朋友,朋友的朋友是朋友,正好对 ...
- slab机制
1.内部碎片和外部碎片 外部碎片 什么是外部碎片呢?我们通过一个图来解释: 假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框.这个时候,在这段内存上不能找到连续的5 ...
- Spring MVC页面重定向
以下示例显示如何编写一个简单的基于Web的重定向应用程序,这个应用程序使用重定向将http请求传输到另一个页面. 基于Spring MVC - Hello World实例章节中代码,创建创建一个名称为 ...
- Linux学习之CentOS(六)---mount挂载设备(u盘,光盘,iso等 )
对于新手学习,mount 命令,一定会有很多疑问.其实我想疑问来源更多的是对linux系统本身特殊性了解问题. linux是基于文件系统,所有的设备都会对应于:/dev/下面的设备.如: [cheng ...
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- 排序分析函数中对null的处理
--排序分析函数中对null的处理 --分析:对于null在分析函数中是升序默认是nulls last,降序默认是nulls first.如果不指定排序,那么是升序 )); ,'测试1'); ,'测试 ...