http
请求和相应的通用的超文本协议
协议:是一种浏览器和服务器的协议,一种通信标准
通用:范围广
无状态:无请求时连接中断
超文本协议:可以是音频视频各种形式
安卓
安卓程序作为用户和服务器中介承担接受用户操作和请求服务器以及接受服务器响应和向用户做出反馈的作用。
HttpClient的使用过程(已经废弃我会在之后的里面介绍OkHttpCilent)
1.生成代表客户端的HttpClient对象
2.生成代表请求的HttpGet对象
3.发送请求,获得服务器返回的HttpResponse对象
4.检查响应状态是否正常
5.获取响应对象当中的数据
注意:主线程不能访问网络
已经废弃
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//在主线程中不可以访问网络需要新建线程
NetWorkThread t = new NetWorkThread();
t.start();
}
});
}
class NetWorkThread extends Thread {
@Override
public void run() {
//创建HttpClient对象
HttpClient httpClient = new DefaultHttpClient();
//创建代表请求对象,参数为访问的服务器地址
HttpGet get = new HttpGet("http://www.marschen.com/data1.html");
//执行请求,获取服务器返回的对象,服务器返回代码200正常,404客户端错误,
//505服务器错误
try {
HttpResponse response = httpClient.execute(get);
int code = response.getStatusLine().getStatusCode();
if(code == 200) {
//从响应对象取出数据需要entity
HttpEntity entity = response.getEntity();
//以输入流的形式获得数据
InputStream in = entity.getContent();
//处理流数据
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = reader.readLine();
Log.d("client", line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
过程详解
- Http请求内容分析
请求头:消息的基础属性:来源,目的,特点
Host:marschen.com 本次请求访问主机地址
Cache-control:no-cache 设置网页缓存的使用方法
Pragma:no_cache 有关缓存
Accept:text/html,xxxxx… 浏览器可以接受的数据类型
User-Agent:Mozilla/5.0xxx 主要表示客户端类型
Accept-Encoding :gzip,deflate,sdcn 浏览器能够解码的数据编码方式,服务器可能会压缩数据进行返回
Accept-Language:zh-CN,zh;q=0.8 浏览器期望接受的语言种类
请求体:请求的内容 - 响应内容分析
响应头:
Content-encoding 返回数据的压缩格式
Content-Length 返回数据量的大小
Content-Type 返回数据的类型
Last-Modified 资源最后修改的时间
Date 返回数据的时间
Server 服务器类型
响应体:响应的内容 - 请求头与响应头的读取
请求头的读取
//获取请求头的内容,请求头内容全部存储在键值对中
Header[] reqHeader = get.getAllHeaders();
for(Header header : reqHeader) {
String key = header.getName();
String value = header.getValue();
Log.d("client","request header name is :" + key + ",and request value is :" + value);
}
响应头的读取
//获取响应头的内容,都是以键值对存储
Header[] respHeader = response.getAllHeaders();
for(Header header:respHeader) {
String key = header.getName();
String value = header.getValue();
Log.d("client", "response header name is :" + key + ", and response value is :" + value);
}
Http请求种类
get():用于请求URI得到资源
post():向服务器提交新的内容
其他的方法逐渐不用了:
put:修改某个内容
delete:用于删除某个内容
区别:
- get方法用于从服务器取回数据,post用于向服务器提交数据
- get通常提交的数据量不超过2k,post提交的数据量没有限制
get请求是将所有要提交的数据附在URL之后,而Post请求是将提交的数据放置在请求的请求体当中。
post提交数据的步骤
构造请求对象
- 将需要传递给服务器端的数据放置在键值对对象当中;
- 将准备好的键值对放置在List中
- 生成代表请求体的对象
- 将存有请求键值对的List对象放置在请求体对象当中
- 将请求体对象放置到请求对象当中
- 发送请求对象