一.HTTP是什么:
在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
但从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive
|
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
http://www.androidchina.NET/394.html
在android studio 下,如果需要使用HttpClient,需要在build.gradle(所要用的模块)文件中添加如下字段
android {
useLibrary 'org.apache.http.legacy'
}
二.HTTP如何使用:
三.GET和POST的DEMO.
try {
urlConnect.setRequestMethod("GET");
urlConnect.connect();
//输入流读取字节,再将它们转换成字符.得到读取的内容
InputStreamReader in=newInputStreamReader( urlCoonection.getInputStream());
//BufferedReader:接受Reader对象作为参数,并对其添加字符缓冲器,
BufferedReader buffer = new BufferedReader(in);
String inputLine = null;
String resultData = null;
while ((inputLine=buffer.readLine()) !=null) {
//利用循环来读取数据
resultData +=inputLine;
}
textView.setText(resultData);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
String params;
try { // 在传递中文时的参数时,会产生乱码
params = "username=" + URLEncoder.encode("hello", "UTF-8")+ "&password=" +URLEncoder.encode("eoe", "UTF-8");
byte[] postData = params.getBytes();
//创建一个URL对象
URL pathUrl = new URL(url);
//创建一个HttpURLConnection连接
HttpURLConnection urlConnect = (HttpURLConnection) pathUrl.openConnection();
//设置连接超时时间
urlConnect.setConnectTimeout(10000);
//post请求必须设置允许输出
urlConnect.setDoOutput(true);
//post请求不能使用缓存
urlConnect.setUseCaches(false);
//设置post方式请求
urlConnect.setRequestMethod("POST");
urlConnect.setInstanceFollowRedirects(true);
// 配置请求Content-Type
urlConnect.setRequestProperty("Content-Type", "application/x-www-form-urlencode");
//开始连接,注意以上的所有设置必须要在conect之前完成
urlConnect.connect();
// 发送请求参数,将OutputStream封装成DataOutputStream
/*DataOutputStream dos =(DataOutputStream) urlConnect.getOutputStream();*/
DataOutputStream dos = new DataOutputStream(urlConnect.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
if(urlConnect.getResponseCode() ==200){//请求成功
byte[] data = readInputStream(urlConnect.getInputStream());
String string = new String(data, "UTF-8");
textView.setText(string);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
四.GET和POST的区别
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
3.get是从服务器上获取数据,post是向服务器传送数据。
4.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
5.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
6.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
7.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
2.HttpClient
HttpClient是Apache提供的访问网络的接口。
HttpClient httpClient = new DefaultHttpClient();
HttpConnectionParams
.setConnectionTimeout(httpClient.getParams(), 10000); // 设置连接超时
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 10000); // 设置数据读取时间超时
ConnManagerParams.setTimeout(httpClient.getParams(), 10000); // 设置从连接池中取连接超时
HttpGet httpget = new HttpGet(url); // 获取请求
try {
HttpResponse response = httpClient.execute(httpget); // 执行请求,获取响应结果
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 响应通过
String result = EntityUtils.toString(response.getEntity(),
"UTF-8");
textView.setText(result);
} else {
// 响应未通过
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
HttpClient httpClient = new DefaultHttpClient(); // 新建HttpClient对象
HttpPost httpPost = new HttpPost(url); // 新建HttpPost对象
List<NameValuePair> params =new ArrayList<NameValuePair>(); //使用NameValuePair来保存要传递的Post参数
params.add(new BasicNameValuePair("username", "hello")); //添加要传递的参数
params.add(new BasicNameValuePair("password", "eoe"));
try {
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8); // 设置字符集
httpPost.setEntity(entity);// 设置参数实体
HttpResponse httpResp = httpClient.execute(httpPost);// 获取HttpResponse实例
if(httpResp.getStatusLine().getStatusCode()==HttpStatus.SC_OK){//响应通过
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
textView.setText(result);
}else{
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}