Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
2015-09-09 10:29
1231 查看
讲这个之前,我们先来说说get和post两种请求的区别吧!!!
原文:http://blog.csdn.net/u010687392/article/details/43672317
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.
[java]
view plaincopyprint?
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:
[java]
view plaincopyprint?
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对象来传的。
(客户端代码):这个就更简洁了,简单易懂有木有。。。
[java]
view plaincopyprint?
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:
[java]
view plaincopyprint?
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方式发送请求的方法
直接上代码吧,区别我开始已经讲的很清楚了~
(客户端代码):
[java]
view plaincopyprint?
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();
}
(服务端代码):
[java]
view plaincopyprint?
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包导入即可。
原文:http://blog.csdn.net/u010687392/article/details/43672317
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.
[java]
view plaincopyprint?
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:
[java]
view plaincopyprint?
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对象来传的。
(客户端代码):这个就更简洁了,简单易懂有木有。。。
[java]
view plaincopyprint?
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:
[java]
view plaincopyprint?
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方式发送请求的方法
直接上代码吧,区别我开始已经讲的很清楚了~
(客户端代码):
[java]
view plaincopyprint?
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();
}
(服务端代码):
[java]
view plaincopyprint?
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包导入即可。
相关文章推荐
- TCP、UDP、IP 协议分析
- TCP协议Demo
- 高性能网络编程7--tcp连接的内存使用
- python 网络爬虫开源框架scrapy
- Cacti - SOCKSTAT - tcpInuse
- 计算机网络学习——04
- Android主线程不能访问网络异常解决办法
- 适合新手的网络编程,用socket传文件(本例传的是jpg图片) 用到sendfile函数
- HTTP/2 与 WEB 性能优化(三)
- HTTP/2 与 WEB 性能优化(二)
- HTTP/2 与 WEB 性能优化(一)
- 贝叶斯网络
- 【转载】TCP TIME_WAIT详解
- delphi请求idhttp数据
- window环境下的ip网络释放和重新连接
- 计算机网络- 可靠数据传输协议-设计和实施的协议,如停止的
- 通达OA 小飞鱼老师OA工作流设计课程教学网络公开课之HTML基础(二)
- 通达OA 小飞鱼老师OA工作流设计课程教学网络公开课之HTML基础(二)
- 读书笔记之TCP/IP1(2)
- HTTP 错误 500.19 - Internal Server Error