目录
1.Android网络使用场景
App发送请求到服务端,服务端返回给APP端的是json格式的字符串,然后APP通过解析json来获取数据。
2.什么是Http协议
Http协议即超文本传输协议(Hypertext Transfer Protocol),是Web联网的基础,也是手机联网常用的协议之一。Http协议是建立在TCP协议之上的一种应用。Http连接最显著的特点是客户端发送的每次请求,都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为一次连接。
Http提供了封装或者显示数据的具体形式,Socket提供了网络通信的能力。
3.什么是Https协议
HTTPS(Hypertext Transfer Protocol Over Secure Socket Layer),即安全套接字层上的超文本传输协议,是以安全为目标的Http通道。简单来讲就是Http的安全版。即Http下加入了SSL层。
HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的Http数据传输。
https:URL表明它使用了Http,但是HTTPS不同与http,它的默认端口及一个加密/身份验证层(在Http与TCP之间)。被广泛应用于万维网上安全敏感的通讯,例如支付交易方面。
4.Android的网络权限
<!-- 允许应用程序打开网络套接字 --> <users-permission android:name="android.permission.INTERNET"/> <!-- 允许应用程序访问网络连接信息 --> <users-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
5.检查网络连接
在执行网络操作之前,检查设备当前连接的网络连接信息是个好习惯。这样可以防止我们的程序在无意间连接使用了非意向的网络频道。如果网络连接不可用,那么我们的应用应该优雅地做出响应。为了检测网络连接,我们需要使用下面两个类:
ConnectivityManager 它会回答关于网络连接的查询结果,并在网络连接改变时,
通知应用程序
NetworkInfo 描述一个给定类型(移动网络或者WIFI)的网络接口状态。 下面这个方法可以找到的第一个已连接的网络接口,如果返回null,则表示没有已连接的网络接口(意味着网络连接不可用)。
public boolean isOnline(){ ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = manager.getActiveNetworkInfo(); return (info != null && info.isConnected()); }
6.从服务器获取数据
步骤如下:
1.实例化一个URL对象。 2.获取HttpURLConnection对象(这是自带的原生,以后会用第三方的)。 3.设置请求连接属性。 4.获取响应码,判断连接结果码。 5.读取输入流并解析。
7.GET请求
注意:主线程和子线程
@Override public void onClick(View view) { switch (view.getId()) { case R.id.getData: //主线程 new Thread(new Runnable() { @Override public void run() { requestDataByGet(); } }).start(); //注意别忘了start() break; } } } //get方式请求数据 private void requestDataByGet() { 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(); //输入流转换成字符串 result = StreamUtil.streamToString(inputStream); //将Unicode字符转换为UTF-8类型的字符 result = StreamUtil.decode(result); //开启子线程 runOnUiThread(new Runnable() { @Override public void run() { textView.setText(result); } }); }else{ Log.e(TAG,"run:error code"+responseCode+",errorMessage:"+responseMessage); } } catch (Exception e) { e.printStackTrace(); } }
另外一种读取方法:
if(requestCode == HttpURLConnection.HTTP_OK){ InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream()); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder builder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null){ builder.append(line) } return builder.toString(); }
8.POST请求
将请求的参数独立封装,再传输出去。
//post方式请求数据 private void requestDataByPost() { try { URL url = new URL("http://www.imooc.com/api/teacher"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(30*1000); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type","application/json"); connection.setRequestProperty("Charset","UTF-8"); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestProperty("Accept-Charset","UTF-8"); //设置不缓存 connection.setUseCaches(false); connection.connect(); //设置参数 String data = "username="+getEncodeValue("imooc")+"&number="+getEncodeValue("123456"); OutputStream outputStream = connection.getOutputStream(); //写入参数 outputStream.write(data.getBytes()); outputStream.flush(); outputStream.close(); int responseCode = connection.getResponseCode(); String responseMessage = connection.getResponseMessage(); if(responseCode == HttpURLConnection.HTTP_OK){ InputStream inputStream = connection.getInputStream(); //输入流转换成字符串 result = StreamUtil.streamToString(inputStream); //将Unicode字符转换为UTF-8类型的字符 result = StreamUtil.decode(result); //开启子线程 runOnUiThread(new Runnable() { @Override public void run() { textView.setText(result); } }); }else{ Log.e(TAG,"run:error code"+responseCode+",errorMessage:"+responseMessage); } } catch (Exception e) { e.printStackTrace(); } } //将字符串编码设置为UTF-8 public String getEncodeValue(String str){ String encode = null; try { encode = URLEncoder.encode(str,"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return encode; }
9.GET与POST的区别
区别如下:
协议 用法 安全(传输) 安全(本质上) 冥等性 可缓存 TCP 获取数据 X √ √ √ UDP 提交数据 √ X X X
10.JSON解析
JSONObject 指的是Json对象 JSONArray 指的是Json数组
10.1 原生方式解析JSON
JSON数据如下:
{ status: 1, data: [ { id: 1, name: "Tony老师聊shell——环境变量配置文件", picSmall: "http://img.mukewang.com/55237dcc0001128c06000338-300-170.jpg", picBig: "http://img.mukewang.com/55237dcc0001128c06000338.jpg", description: "为你带来shell中的环境变量配置文件", learner: 12312 }, { id: 2, name: "数学知识在CSS动画中的应用", picSmall: "http://img.mukewang.com/55249cf30001ae8a06000338-300-170.jpg", picBig: "http://img.mukewang.com/55249cf30001ae8a06000338.jpg", description: "数学知识与CSS结合实现酷炫效果", learner: 45625 }, { id: 3, name: "Oracle数据库开发必备利器之PL/SQL基础", picSmall: "http://img.mukewang.com/5523711700016d1606000338-300-170.jpg", picBig: "http://img.mukewang.com/5523711700016d1606000338.jpg", description: "Oracle数据库高级开发必备的基础。", learner: 41236 }, ], msg: "成功" }
步骤1:定义对应的实体类
//Lesson实体类 public class Lesson { private int id; private int learnerNumber; private String name; private String smallPictureUrl; private String bigPictureUrl; private String description; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getLearnerNumber() { return learnerNumber; } public void setLearnerNumber(int learnerNumber) { this.learnerNumber = learnerNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSmallPictureUrl() { return smallPictureUrl; } public void setSmallPictureUrl(String smallPictureUrl) { this.smallPictureUrl = smallPictureUrl; } public String getBigPictureUrl() { return bigPictureUrl; } public void setBigPictureUrl(String bigPictureUrl) { this.bigPictureUrl = bigPictureUrl; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return "Lesson{" + "id=" + id + ", learnerNumber=" + learnerNumber + ", name='" + name + '\'' + ", smallPictureUrl='" + smallPictureUrl + '\'' + ", bigPictureUrl='" + bigPictureUrl + '\'' + ", description='" + description + '\'' + '}'; } }
//查询的结果集实体类 public class LessonResult { private int status; List<Lesson> lessonsList; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public List<Lesson> getLessons() { return lessonsList; } public void setLessons(List<Lesson> lessonsList) { this.lessonsList = lessonsList; } @Override public String toString() { return "LessonResult{" + "status=" + status + ", lessonsList=" + lessonsList + '}'; } }
步骤二:解析JSON数据
//处理解析Json数据 private void handleJSONData(String result) { try { LessonResult lessonResult = new LessonResult(); List<Lesson> lessonList = new ArrayList<Lesson>(); JSONObject jsonObject = new JSONObject(result); int status = jsonObject.getInt("status"); lessonResult.setStatus(status); JSONArray jsonArray = jsonObject.getJSONArray("data"); if(jsonArray != null && jsonArray.length() != 0){ for (int i = 0;i<jsonArray.length();i++){ JSONObject lessonObject = (JSONObject) jsonArray.get(i); int id = lessonObject.getInt("id"); int learner = lessonObject.getInt("learner"); String name = lessonObject.getString("name"); String smallPicture = lessonObject.getString("picSmall"); String bigPicture = lessonObject.getString("picBig"); String description = lessonObject.getString("description"); Lesson lesson = new Lesson(); lesson.setId(id); lesson.setName(name); lesson.setSmallPictureUrl(smallPicture); lesson.setBigPictureUrl(bigPicture); lesson.setDescription(description); lessonList.add(lesson); } lessonResult.setLessons(lessonList); } textView.setText(lessonResult.toString()); } catch (JSONException e) { e.printStackTrace(); } }
10.2 第三方框架解析方式