网络基础知识
http协议
1. Android 网络知识简介
Android程序最重要的模块就是网络部分,如何从网络上下载数据,如何将处理过的数据上传至网络,往往是android程序的关键环节...
2. Android 网络的使用场景
现在多半数是基于移动端的开发,那么这时候我们所开发的app就要不断的向服务器端发送请求,然后服务器端会根据相应的请求字段将相应的内容返回给app端,这时候返回给app端的是json格式的字符串,然后app端通过一定的json解析手段将一定的数据显示在对应的控件上,达到数据显示的效果。
3.什么是Http协议?
HTTP协议即超文本传送协议(Hypertext Transfer Protocol),是Web联网的基础,也是手机联网常用的协议之一, HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。HTTP提供了封装或者显示数据的具体形式。Socket 提供了网络通信的能力
4.什么是Https协议?
HTTPS (全称: Hypertext Transfer Protocol over Secure Socket Layer ),是以安全为目标的HTTP通道简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.它是一 个URI scheme (抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL 表明它使用了HTTP但HTTssPS存在不同于HTTP的默认端口及-一个加密/身份验证层(在HTTP与TCP之间)被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
5. Android中网络权限:
<uses- permission
android:name =" android.permission.INTERNET />
<--允许应用程序打开网络套接字-->
<uses-permission
android:name="android.permission.ACCESS_ NETWORK STATE*/>
<--允许应用程序访问网络连接信息-->
6.检查网络连接
在执行网络操作之前,检查设备当前连接的网络连接信息是个好习惯。这样可以防止我们的程序在无意间连接使用了非意向的网络频道。如果网络连接不可用,那么我们的应用应该优雅地做出响应。为了检测网络连接,我们需要使用到下面两个类:
1) ConnectivityManager :它会回答关于网络连接的查询结果,并在网络连接改变时通知应用程序。
2) NetworkInfo :描述一 个给定类型(移动网络或Wi-Fi等)的网络接口状态。下面这个方法可以找到的第一个已连接的网络接口,如果返回null ,则表示没有已连接的网络接口(意味着网络连接不可用) :
网络请求
网络请求方式
从服务器获取数据
1、实例化一个URL对象
2、获取HttpURLConnection对象
3、设置请求连接属性
4、获取响应码,判断连接结果码
5、读取输入流并解析
GET VS POST
代码演示get请求
package com.example.mdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class NetworkActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTextView;
private Button mButton;
private Button mParseDataButton;
private static final String TAG = "NetworkActivity";
private String mResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_network);
findViews();
setListeners();
}
private void findViews(){
mTextView = findViewById(R.id.textView);
mButton = findViewById(R.id.getButton);
mParseDataButton = findViewById(R.id.parseDataButton);
}
private void setListeners(){
mButton.setOnClickListener(this);
mParseDataButton.setOnClickListener(this);
}
public void onClick(View v){
switch (v.getId()){
case R.id.getButton:
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL("http://www.imooc.com/api/teacher?type=2&page=1");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(30*1000);
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type","application/json");
connection.setRequestProperty("Charset","UTF-8");
connection.setRequestProperty("Accept-Charset","UTF-8");
connection.connect();//发起连接
int responseCode = connection.getResponseCode();//获取请求码
String responseMessage = connection.getResponseMessage();//获取返回的消息
if (responseCode == HttpURLConnection.HTTP_OK){
InputStream inputStream = connection.getInputStream();
mResult = streamToString(inputStream);
runOnUiThread(new Runnable() {
@Override
public void run() {
mResult = decode(mResult);
mTextView.setText(mResult);
}
});
// mTextView.post(new Runnable() {
// @Override
// public void run() {
//
// }
// });
} else {
//TODO: error fail
Log.e(TAG,"run: error code:" + responseCode + ",message:" + responseMessage);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
break;
case R.id.parseDataButton:
break;
}
}
/**
* 将输入流转换成字符串
*
* @param is 从网络获取的输入流
* @return 字符串
*/
public String streamToString(InputStream is) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
baos.close();
is.close();
byte[] byteArray = baos.toByteArray();
return new String(byteArray);
} catch (Exception e) {
Log.e(TAG, e.toString());
return null;
}
}
/**
* 将Unicode字符转换为UTF-8类型字符串
*/
public static String decode(String unicodeStr) {
if (unicodeStr == null) {
return null;
}
StringBuilder retBuf = new StringBuilder();
int maxLoop = unicodeStr.length();
for (int i = 0; i < maxLoop; i++) {
if (unicodeStr.charAt(i) == '\\') {
if ((i < maxLoop - 5)
&& ((unicodeStr.charAt(i + 1) == 'u') || (unicodeStr
.charAt(i + 1) == 'U')))
try {
retBuf.append((char) Integer.parseInt(unicodeStr.substring(i + 2, i + 6), 16));
i += 5;
} catch (NumberFormatException localNumberFormatException) {
retBuf.append(unicodeStr.charAt(i));
}
else {
retBuf.append(unicodeStr.charAt(i));
}
} else {
retBuf.append(unicodeStr.charAt(i));
}
}
return retBuf.toString();
}
}
9.0新特性
1、9.0对http请求的限制
2、创建安全配置文件
①在res文件夹下创建xml/network-security-config文件
②增加cleartextTrafficPermitted属性
3、添加安全配置文件
①AndroidManifest.xml中的Application申明
②增加cleartextTrafficPermitted属性
数据解析
一、什么是JSON?
一种轻 量级的数据交换格式,具有良好的可读和便于快速编写的特性。 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, 获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。
二、Json 格式:
三、使用json解析图2的Json字符串:
JSON数据般由服务器端提供接口,我们根据接口地址解析数据,最终将数据显示在APP上的过程,以图2为例来演示json数据解析。
private void parseJsonMulti(String strResult){
try{
JSONArray jsonObjs = new JSONObject(strResult).getJSONArray("singers");
String s = "";
for(int i = 0;i <jsonObjs.length();i ++){
JSONObject jsonObj = (JSONObject) jsonObjs.get(i);
int id = jsonObj.getInt("id");
String name = jsonObj.getString("name");
String gender = jsonObj.getString("gender");
s += "ID号"+id+",姓名:"+name+",性别:"+gender+"\n";
}
tvJson.setText(s);
}catch (JSONException e){
System.out.println("Jsons parse error!");
e.printStackTrace();
}
}