网络请求
补充:
以写一个“登录”为例
https://github.com/maoqiu123/saiyou
前提小概念
JSON--数据传输格式
- 可以理解为String类型,因为需要在APIResponce中注明
- 完整的JSON包括三个部分(如图所示)
- code
- msg
- date
Postman的一把爽体验(一不小心把后端搞崩了.....羞涩)
- GET
- 网址的后面还需要加上“?+相关信息”
- Post
- 上传的item必须是JSON中有的,不然造成空指针现象,导致崩盘
APIService.java
public interface APIService {
/**
* 登录
*/
@POST("saiyou/public/index.php/login")
Call login(@Body LoginRequest loginRequest);
}
- @POST 括号内为对应网址的局部
- @Body 后面跟着Java类的引用,因为后面的LoginRequest是一个新的类
- call
- 该方法将请求发送到webserver并返回响应
- APIResponse 见下下一个标题 是一个独立的Activity
- login 这个属于网络请求,在LoginActivity.java中的processLogin函数会用到
LoginRequest.java
相当于为Body建立一个框架
设置清晰每一个item 的get 和set方法
这个 get 和 set方法是自己写的,不是拓展自己来的
-
在 LoginActivity.java文件中就会用到set,用的时候直接像这样
- 用的时候直接像这样
LoginRequest request = new LoginRequest();//先实例化一个对象
request.setIdentifier('defhewkdhkeh"');
public class LoginRequest extends BaseModel {
private String phone;
private String password;
public LoginRequest() {
}
public String getIdenttifier(){
return phone;
}
public void serIdentifier(String phone){
this.phone=phone;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
}
APIResponse.java
- 数据传输格式JSON中,三大重要组成
- msg
- code
- date
public class APIResponse extends BaseModel {
private int code = -2;
private T data;
private String msg="";
public String getMsg(){
return msg;
}
public void setMsg(String msg){
this.msg=msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
【注意:】由于date 的内容很多很杂,所以我们传进去的是一个范形T
有 { } 的类型--不需要带 ? 和 {...}
Query获取信息的方法和途径
T范式和 多形式响应获取其一Token的方法
1.我们需要缓存的仅仅是响应中的一部分的话,那就需要专门写一个类似model的Java文件,然后从里面获得所需要的token
- TokenRequest.java
- 在XXXPresent.java文件中需要进行改动(retrofit里面的内容),就是改如果数据成功时候 进行数据缓存的方法
T范式在Retrofitservice.java中写,然后在P层中的retrofit框架中的BaseObserver中会自动跳出
model里面的全部内容只能放后端需要的东西,多少一个都不行,有其他多余的东西,跟在model的参数后面就行
开发中遇到的坑
1.【ERROR】: on a null object reference
java.lang.NullPointerException:
Attempt to invoke interface method 'void com.hrsoft.taskgo.mvp.presenter.account.contract.ForgetPasswordContract$Presenter.sendRequestNewInformation(com.hrsoft.taskgo.mvp.model.account.request.ForgetPasswordModel, java.lang.String)'
on a null object reference
原来
后来
然而还真是。。。。
2.【ERROR】: on a null object reference
知识须知-网络请求对应的
好的,继续问题
注意注意!
-
BaseURL需在Config里面进行更改
- 与后端给出的github相对
/**
* APP Server 网络请求BaseUrl
*/
public static final String APP_SERVER_BASE_URL = "http://www.thmaoqiu.cn/";