网络请求:okhttp使用
-
第三方库okhttp的引入
okhttp的引入 - post请求
1.入参格式声明
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
2.请求实现
//url: 请求链接 , json:入参json字符串
String run(String url, String json) {
//1.声明http请求管理类
OkHttpClient client = new OkHttpClient();
//2.声明入参
RequestBody body = RequestBody.create(JSON, json);
//3.声明请求
Request request = new Request.Builder().url(url).post(body).build();
try {
//4.发送请求,接受响应
Response response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
return e.toString();
}
}
-
注意点
1.网络请求要放在异步线程处理
2.要在AndirodMainifest中声明允许网络权限
网络权限
异步处理:AnsyncTask使用
class MyAsyncTask extends AsyncTask<Integer,Integer, String>{
@Override
//重写doInBackground方法,在该方法中处理要处理的异步请求
protected String doInBackground(Integer... integers) {
return login(email,pwd);
}
}
- 在子线程上进行数据请求,在UI线程上刷新UI
// 0.定义接口
public interface OnTaskLisnten{
void onSuccess(Context context, String result);
void onFailure(Context context, String msg);
}
//1.定义Task
class MyAsyncTask extends AsyncTask<Integer,Integer, String>{
private String result;
private OnTaskLisnten lisnten;
private Context context;
public MyAsyncTask(Context context, OnTaskLisnten listen){
this.lisnten = listen;
this.context = context;
}
@Override
protected String doInBackground(Integer... integers) {
result = login(email,pwd);
return result;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s.length() > 0){
this.lisnten.onSuccess(context,s);
}else {
this.lisnten.onFailure(context, "请求失败,请稍后再试");
}
}
}
// 2.使用异步请求类
email = emailText.getText().toString();
pwd = pwdText.getText().toString();
MyAsyncTask task = new MyAsyncTask(this, new OnTaskLisnten() {
@Override
public void onSuccess(Context context, String result) {
}
@Override
public void onFailure(Context context, String msg) {
}
});
入参序列化
将object对象转换为JSONObject,调用JSONObject的toString方法可以获取到json字符串
Map<String,String > param = new HashMap<String, String>();
param.put("email", email);
param.put("passwd", pwd);
JSONObject jsonParam = new JSONObject(param);
Log.e("test",jsonParam.toString());
String result = run("http://120.79.19.171:3021/Login/loginChecked", jsonParam.toString());
出参序列化(不包含嵌套(可以用递归处理))
方案1:出参json字符串 --》 JSONObject --> Map<String, Object>
// 声明一个存储map
Map<String, Object> responseDic = new HashMap<String , Object>();
try {
// json字符串 --》JSONObject
JSONObject object = new JSONObject(result);
// 获取所有keys
Iterator<String> keysIter = object.keys();
// 遍历所有key,根据key取出相应的value值,然后存入map中
while (keysIter.hasNext()){
String key = keysIter.next();
Object value = object.get(key);
responseDic.put(key,value);
}
Log.e("test-1",responseDic.toString());
}catch (Exception e){
Log.e("test", "解析失败");
}
方案二: fastjson
String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化