前言
http(hypertext transform protocol)超文本传输协议是一种数据格式,定义了web客户端与服务器端之间的对话,以及服务器如何传输数据到客户端。
http连接使用TCP/IP协议来传输数据,客户端到服务器的请求分四个步骤:
- 客户端在端口打开与服务器的连接,URL还可以指定其它端口(URL构成:协议protocol主机host路径path参数QueryString)
- 客户端想要发送消息,请求指定路径上的资源。这个请求包括一个首部,可选地址,后面是请求的数据。
- 服务器端向客户端发送响应,响应以响应码开头,后面是元数据的的首部,一个空行以及所请求的文档或者错误消息。
- 服务器关闭连接
与http服务器的通信遵守请求-响应模式:先是一个无状态请求,后面是无状态响应。大致分为几部分:
1.起始行,包括http方法和要执行这个方法的资源的路径。
2.一个包含名-值字段的首部,可以提供元信息
3.一个请求主体,包括资源的一个表示
4个主要HTTP方法GET POST PUT DELETE
HTTP接口访问
1.网咯连接检查
首先要检查当前是否处于上网状态,让后在进行网络访问操作。如果当前网络不可用,那么无须执行网络访问,直接提示用户"请开启网络连接“就好了。检查网络连接,Android会要求App具有上网的权限,下面就要打开 AndroidManifest.xml经行网络的配置。
<!--互联网-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--查看网络连接状态-->
<uses-permission android name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android name="android.permission.ACCESS_WIFI_STATE"/>
添加网络权限配置后,是用ConnectivityManager检测网络连接,该工具的对象从系统服务Context.CONNECTIVITY_SERVICE中获取。调用连接管理对象的getActiveNetworfInfo(),返回一个NetworkInfo实例,通过该实例可获取详细的网络连接通信信息。下面是NetworkInfo常用的方法。
- getType():获取网络类型。
ConnectivityManager类的网络类型 | 说明 |
---|---|
TYPE_WIFI | wifi |
TYPE_MOBILE | 数据连接 |
TYPE_WIMAX | wimax |
TYPE_ETHERNET | 以太网 |
TYPE_BLUETOOTH | 蓝牙 |
TYPE_VPN | vpn |
- getState():获取网络状态。
- getSubtype():获取网络子类型。
2.移动数据格式JSON
网络通信的交互数据有两大类,分别是JSON和XML。对于App来说,基本采用JSON格式与服务器通信。一个是JSON串比XML串短很多,在节省流量上占了优势;另外一个是JSON串解析的更快,也省电。
Android自带JSON解析工具,提供JSONObject(JSON对象)和JSONArray(JSON数组)的解析处理.
1.JSONObject
下面来看JSONObject的常用方法。
- JSONObject构造函数:从指定字符串构造一个JSONObject对象。
- getJSONObject:获取指定名称的JSOnObject对象。
- getString:获取指定名称的字符串
- getInt:获取指定名称的整形
- getDouble:获取指定名称的双精度数。
- getBoolean:获取指定名称的布尔数。
- getJSONArray:获取指定名称的JSONArray数组对象。
- put:添加一个JSONObject对象。
- toString:把当前的JSONObject对象输出位一个JSON字符串。
2.JSONArray
下面是JSONArray常用方法。
- length:获取JSONArray数组的长度。
- getJSONObject:获取JSONArray数组在指定位置的JSONObject对象。
- put:往JSONArray数组中添加一个JSONObject对象。
下面是使用JSON串的代码
public class JsonActivity extends AppCompatActivity implements OnClickListener {
private TextView tv_json;
private String mJsonStr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_json);
tv_json = (TextView) findViewById(R.id.tv_json);
findViewById(R.id.btn_construct_json).setOnClickListener(this);
findViewById(R.id.btn_parser_json).setOnClickListener(this);
findViewById(R.id.btn_traverse_json).setOnClickListener(this);
mJsonStr = getJsonStr();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_construct_json) {
tv_json.setText(mJsonStr);
} else if (v.getId() == R.id.btn_parser_json) {
tv_json.setText(parserJson(mJsonStr));
} else if (v.getId() == R.id.btn_traverse_json) {
tv_json.setText(traverseJson(mJsonStr));
}
}
//构造JSON串
private String getJsonStr() {
String str = "";
JSONObject obj = new JSONObject();
try {
obj.put("name", "address");
JSONArray array = new JSONArray();
for (int i = 0; i < 3; i++) {
JSONObject item = new JSONObject();
item.put("item", "第" + (i + 1) + "个元素");
array.put(item);
}
obj.put("list", array);
obj.put("count", array.length());
obj.put("desc", "这是测试串");
str = obj.toString();
} catch (JSONException e) {
e.printStackTrace();
}
return str;
}
//解析JSON串
private String parserJson(String jsonStr) {