android开发笔记:使用okhttp框架发起网络请求与使用g
2017-09-28 本文已影响69人
猫留下你走吧
前言
网络请求是每一个app必定存在的功能,本教程教你看懂接口文档并使用okhttp框架发起网络请求向服务器请求数据并解析返回数据。
提示
本教程用的是java后台,开始的配置比想象的麻烦,想速成推荐使用php后台,学习可以查看一些关于php的mysqli函数的使用,获取数据库数据最后以json形式返回。但是多人开发一般是有人写后台,并提供你一个接口文档
接口文档怎么看?
例子:
————————————————
接口名称
获取用户基础信息API
1) 请求地址
http://www.hellomiao.cn:8080/API/mobile/main/getUserInfoByUserId
2) 调用方式:HTTP post
3) 接口描述:
- 接口描述详情
4) 请求参数:
POST参数:
字段名称 | 字段说明 | 类型 | 必填 | 备注 |
---|---|---|---|---|
userId | 账号 | string | Y | - |
5) 请求返回结果:
{
"msg": "用户信息获取成功",
"companyId": null,
"phone": null,
"userType": 4,
"userId": "1072844432@qq.com",
"status": 1
}
6) 请求返回结果参数说明:
字段名称 | 字段说明 | 类型 | 必填 | 备注 |
---|---|---|---|---|
msg | 服务器返回信息 | string | Y | - |
companyId | 加入/注册公司的id | string | Y | - |
phone | 电话 | string | Y | - |
userType | 用户类型 | string | Y | - |
userId | 账号 | string | Y | - |
status | 状态码 | string | Y | - |
————————————————
浏览该文档,我们大致就要知道发起网络请求的最基本的信息是:
- 接口作用(不必多说)
- 接口地址
- 请求方式 psot
- 传入参数 userId
- 接收参数 msg/companyId/phone/userType/userId/status
都获取到以上信息后,我们就可以用该接口去发起网络请求了
准备工作1 —— 安装框架
在build.gradle
中添加:
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okio:okio:1.7.0'
compile 'com.google.code.gson:gson:2.7'
然后再点击右上角的 sync onw
导入到项目中
准备工作2 —— 为app添加网络权限
没有添加权限是不让发起网络请求的,因此需要添加网络连接权限:
打开AndroidManifest.xml
,在<manifest></manifest>之间添加一句:
<uses-permission android:name="android.permission.INTERNET"/>
屏幕快照 2017-09-28 上午12.39.14.png
准备工作3 —— 创建的实体类
实体类创建的作用有两个:
- 作为对象,其属性是到处用得到,不必多说
- 为我们json转对象做准备
User.java
package cn.hellomiao.www.networkdemo.entity;
/**
* Created by liwenban on 2017/9/28.
*/
public class User {
private int status;
private String msg;
private String accountId;
private String password;
private String phone;
private int userType;
private String companyId;
//默认构造方法 User user = new User();
public User(){
}
//构造方法一 User user = new User("","",...);
public User(int status, String msg, String accountId, String password, String phone, int userType, String companyId) {
this.status = status;
this.msg = msg;
this.accountId = accountId;
this.password = password;
this.phone = phone;
this.userType = userType;
this.companyId = companyId;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getAccountId() {
return accountId;
}
public void setAccountId(String accountId) {
this.accountId = accountId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getUserType() {
return userType;
}
public void setUserType(int userType) {
this.userType = userType;
}
public String getCompanyId() {
return companyId;
}
public void setCompanyId(String companyId) {
this.companyId = companyId;
}
}
如果实体类不懂是什么,要好好补补java了。get和set方法,构造方法是实体类最基本的东西,都是有快捷键的,自行百度,方便开发
屏幕快照 2017-09-28 上午12.44.12.png大招准备 —— 网络请求
package cn.hellomiao.www.networkdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.gson.Gson;
import java.io.IOException;
import cn.hellomiao.www.networkdemo.entity.User;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class LoginActivity extends AppCompatActivity {
//创建实体类对象user
private User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
getUser();
}
public void getUser(){
//创建请求客户端
OkHttpClient mOkHttpClient=new OkHttpClient();
//创建请求体(传入参数)
RequestBody formBody = new FormBody.Builder()
//模拟传入一个参数,实际可以获取用户输入
.add("accountId", "1072844432@qq.com")
.build();
//创建请求
Request request = new Request.Builder()
//接口地址
.url("http://www.hellomiao.cn:8080/API/mobile/main/getUserInfoByUserId")
//post方式发送请求体
.post(formBody)
.build();
//创建响应
Call call = mOkHttpClient.newCall(request);
//异步方式接收反馈(同步占用主线程,会容易阻塞线程,不推荐使用)
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//请求失败执行这里
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//执行成功执行这里
//将返回数据转成String格式
String str = response.body().string();
//创建gson对象
Gson gson = new Gson();
//将gson会自动把json数据里面的键值对和user里面的属性匹配并付值
user = gson.fromJson(str,User.class);
runOnUiThread(new Runnable() {
@Override
public void run() {
//可以验证以下消息
Toast.makeText(getApplicationContext(), "请求成功:" + user.getMsg(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
说明:原本是提供登录接口给大家演示,为了保证数据安全,所以又改成获取用户信息,所以不要介意LoginActivity