android中HTTP协议访问网络及其方式及其http的GET和POST的优缺点

一.HTTP是什么:

超文本传输协议(HTTP  HyperText  Transfer  Protocol)是互联网上应用最为广泛的一种网络协议。

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.cnblogs.com/sunada2005/p/3304593.html


移动互联网可以使用HTTP访问网络。在Android中,针对HTTP进行网络通信的方法主要有两种:
1.HttpURLConnection
2.HttpClient   
由于官方不再推荐使用HttpClient,而是推荐使用HttpUrlConnection 原因可以看下

http://www.androidchina.NET/394.html

在android studio 下,如果需要使用HttpClient,需要在build.gradle(所要用的模块)文件中添加如下字段

android {

    useLibrary 'org.apache.http.legacy'

二.HTTP如何使用:

1.   获得 HttpURLConnection对象
   
       URL url = new URL("path");
       HttpURLConnection  urlCoonection =  (HttpURLConnection)url.openCoonection;
 < 说明 >
android4.0以上已经不能url.openCoonection;具体参考下面链接
http://www.51testing.com/html/34/361634-851445.html
由于HttpURLConnection 是抽象类,不能直接实例化对象,需要URL的openCoonection()方法来获得,此时获得  HttpURLConnection对象,并没有真正执行连接操作,只是创建了一个新的实例,在连接前,还可以设置一些属性,比如连接超时时间和请求方式等。
 < 说明 >

2.设置请求方式("GET" 和 "POST")
创建了HttpURLConnection对象后,就可以使用该对象发送HTTP请求了,HTTP请
通常分为两种("GET" 和 "POST")
默认为:GET
urlCoonection.setRequestMethod("GET");
urlCoonection.setRequestMethod("POST");
3.设置其他属性
//设置超时时间
urlCoonection.setConnectTimeout(8000); 

4.对获取到的输入流进行读取


5.关闭HTTP 关闭流
urlCoonection.disconnect();
in.close();

三.GET和POST的DEMO.

protected void javaHttpGet(String url) {
try {
//打开一个HttpURLConnection连接
//path 是网络地址 比如:"http://www.baidu.com" 
  URL url = new URL("path");
        HttpURLConnection  urlCoonection =  (HttpURLConnection)url.openCoonection;
//设置post方式请求 可以不写,默认是GET 但建议写上
urlConnect.setRequestMethod("GET");
 // 设置连接超时时间
urlConnect.setConnectTimeout(8000); 
urlConnect.connect();
//输入流读取字节,再将它们转换成字符.得到读取的内容
InputStreamReader in=newInputStreamReader( urlCoonection.getInputStream());
//BufferedReader:接受Reader对象作为参数,并对其添加字符缓冲器,
//使用readline()方法可以读取一行
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();
}

}

protected void javaHttpPost (String url) {
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提供的访问网络的接口

private void connget(String url) {
// 新建HttpClient对象
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();
}
}



private void connectPost(String url) {
 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();
}
}



猜你喜欢

转载自blog.csdn.net/qq_34927117/article/details/53232519