目录
引言
HTTP中的两种请求方式------GET和POST
HTTP协议
GET和POST的区别
OKHTTP库
介绍
实战
准备工作
代码部分
完整例子代码
引言
在Android开发过程中请求和处理来自网络的数据是不可避免,本篇将简单介绍Android如何请求网络数据和处理数据。
HTTP中的两种请求方式------GET和POST
在Android开发中我们会接触到数据的交互,比如写入数据、读取数据等,因此我们需要使用通讯间的协议来进行请求,最常见的协议是HTTP协议,而GET和POST则是HTTP协议中最常用的两种请求方式。
HTTP协议
HTTP(HyperText Transfer Protocol超文本传输协议)是一个设计来使客户端和服务器顺利进行通讯的协议。
HTTP在客户端和服务器之间以request-response protocol(请求-回复协议)工作。
GET和POST的区别
GET | POST |
一般是从服务器上获取数据 | 一般用来上传表单到服务器 |
URL 可见,安全性低 | URL 不可见,安全性高 |
提交的数据有长度限制 | 提交的数据无长度限制 |
数据可缓存 | 数据不可缓存 |
通过拼接URL进行参数传递 | 数据放在请求体中发送 |
以登录注册为例,GET请求可使客户端获取服务端数据,如用户名、密码等。POST是客户端向服务端提交数据,注册时提交密码、账号等。
OKHTTP库
介绍
Android进行网络请求的方式有很多种,其中比较偏底层的是HttpURLConnection。但由于HttpURLConnection涉及操作复杂,调用函数偏多,因此现在人们更偏向于使用将其封装的第三方网络通信库,而我们今天要介绍的OkHttp就属于众多网络通信库中做的最出色的一个。
实战
准备工作
- 添加依赖
在build.gradle(app)中的dependencies那里添加下面的依赖
implementation "com.squareup.okhttp3:okhttp:3.14+"
- 申请权限
在AndroidManifest中的application外面添加下面权限
<uses-permission android:name="android.permission.INTERNET" />
代码部分
- 获取Json链接中的数据(网络请求)
private void getJson() {
//构建okhttp对象,使用build()构建可初始化许多内置成员变量
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
String url ="http://www.imooc.com/api/teacher?type=2&page=1";
Request request = new Request.Builder()
.url(url)
.build();
//Android要求耗时操作需要另开线程
new Thread(() -> {
try {
//请求Json数据
Response response = okHttpClient.newCall(request).execute();
String str = response.body().string();
//除ui线程外,其他线程不允许进行ui操作,runOnUiThread()底层是handle机制
runOnUiThread(() -> textView.setText(str));
}catch (Exception e){
//原因可能是url不规范问题等
}
}).start();
}
- 为了接收Json中的数据,我们需要定义一个Json数据接收类 (代码在下面完整例子中)
- 处理获取到的Json数据(处理网络数据)
private void dealJson() {
try {
//根据获取的数据创建Json对象
JSONObject jsonObject = new JSONObject(result);
//获取此Json链接中的“data”数组
JSONArray jsonArray = jsonObject.getJSONArray("data");
//创建我们新建的类来接收数据
MyJson myJson = new MyJson();
//接收和处理数据
myJson.setStatus(jsonObject.getInt("status"));
myJson.setMsg(jsonObject.getString("msg"));
if(jsonArray != null && jsonArray.length()>0){
List<MyJson.Data> dataList = new ArrayList<>();
for(int i = 0;i<jsonArray.length();i++){
JSONObject j = (JSONObject) jsonArray.get(i);
MyJson.Data data = new MyJson.Data();
data.setId(j.getInt("id"));
data.setLearner(j.getString("learner"));
data.setName(j.getString("name"));
data.setPicSmall(j.getString("picSmall"));
data.setPicBig(j.getString("picBig"));
data.setDescription(j.getString("description"));
dataList.add(data);
}
myJson.setDataList(dataList);
String s ="";
//以处理Json链接中的“name”为例
for(MyJson.Data data : dataList){
s += data.getName()+"\n";
}
textView.setText(s);
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this,"处理失败",Toast.LENGTH_LONG).show();
}
}
完整例子代码
- 接收数据类
public class MyJson {
private int status;
private List<Data> dataList;
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public List<Data> getDataList() {
return dataList;
}
public void setDataList(List<Data> dataList) {
this.dataList = dataList;
}
static class Data {
private int id;
private String name;
private String picBig;
private String learner;
private String picSmall;
private String description;
public String getPicSmall() {
return picSmall;
}
public void setPicSmall(String picSmall) {
this.picSmall = picSmall;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPicBig() {
return picBig;
}
public void setPicBig(String picBig) {
this.picBig = picBig;
}
public String getLearner() {
return learner;
}
public void setLearner(String learner) {
this.learner = learner;
}
}
}
- MainActivity中
public class MainActivity extends AppCompatActivity {
private TextView textView;
private String result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.main_text);
Button getBtn = findViewById(R.id.main_get);
Button dealBtn = findViewById(R.id.main_deal);
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
String url ="http://www.imooc.com/api/teacher?type=2&page=1";
Request request = new Request.Builder()
.url(url)
.build();
getBtn.setOnClickListener(v -> {
getJson(okHttpClient, request);
});
dealBtn.setOnClickListener(v -> dealJson());
}
private void dealJson() {
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray jsonArray = jsonObject.getJSONArray("data");
MyJson myJson = new MyJson();
myJson.setStatus(jsonObject.getInt("status"));
myJson.setMsg(jsonObject.getString("msg"));
if(jsonArray != null && jsonArray.length()>0){
List<MyJson.Data> dataList = new ArrayList<>();
for(int i = 0;i<jsonArray.length();i++){
JSONObject j = (JSONObject) jsonArray.get(i);
MyJson.Data data = new MyJson.Data();
data.setId(j.getInt("id"));
data.setLearner(j.getString("learner"));
data.setName(j.getString("name"));
data.setPicSmall(j.getString("picSmall"));
data.setPicBig(j.getString("picBig"));
data.setDescription(j.getString("description"));
dataList.add(data);
}
myJson.setDataList(dataList);
String s ="";
for(MyJson.Data data : dataList){
s += data.getName()+"\n";
}
textView.setText(s);
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this,"处理失败",Toast.LENGTH_LONG).show();
}
}
private void getJson(OkHttpClient okHttpClient, Request request) {
new Thread(() -> {
try {
Response response = okHttpClient.newCall(request).execute();
String str = response.body().string();
runOnUiThread(() -> textView.setText(str));
result = str;
}catch (Exception e){
}
}).start();
}
}
- 对应布局文件中
//使用ScrollView可下滑滚动
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/main_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
<Button
android:id="@+id/main_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取数据"/>
<Button
android:id="@+id/main_deal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解析数据"/>
</LinearLayout>
</ScrollView>