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 -

————————————————
浏览该文档,我们大致就要知道发起网络请求的最基本的信息是:

准备工作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 导入到项目中

屏幕快照 2017-09-28 上午12.33.59.png

准备工作2 —— 为app添加网络权限

没有添加权限是不让发起网络请求的,因此需要添加网络连接权限:
打开AndroidManifest.xml,在<manifest></manifest>之间添加一句:

<uses-permission android:name="android.permission.INTERNET"/>
屏幕快照 2017-09-28 上午12.39.14.png

准备工作3 —— 创建的实体类

实体类创建的作用有两个:

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

上一篇下一篇

猜你喜欢

热点阅读