基于HttpURLConnection的android http请求封装

使用方法

//axiosGH(url,callback)//简写方式,默认为get请求
//axiosGH.get(url,callback)
//axiosGH.get(url,params,callback)
//axiosGH.post(url,callback)
//axiosGH.post(url,params,callback)
axiosGH.post(serverUrl + "/user/login", params, new AxiosGH.Callback() {
@Override
public void onSuccess(String res) {
//请求成功返回参数处理
System.out.println(res);
}
@Override
public void onFailed(String err) {
//请求失败返回参数处理
System.out.println(err);
}
});

代码片段

package com.guhun.server;

import android.annotation.SuppressLint;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import androidx.annotation.NonNull; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL; // 仿造axios书写的http请求——————GuHun
public class AxiosGH {
private String requestMethod;
private boolean useCaches;
private String serverUrl;
private int connectTimeout;
private String encode;
// 初始化实例
public AxiosGH(){
init();
}
// 默认为get请求(地址,回调函数)
public AxiosGH(String url,Callback callback){
init();
serverUrl = url;
handleData(null,callback);
}
// get请求(地址,回调函数)
public void get(String url,Callback callback){
serverUrl = url;
handleData(null,callback);
}
// get请求(地址,map参数,回调函数)
public void get(String url,Map<String,Object> params,Callback callback){
serverUrl = url;
handleData(params,callback);
}
// get请求(地址,object参数,回调函数)
public void get(String url,Object params,Callback callback) {
serverUrl = url;
handleData(objectToMap(params),callback);
}
// post请求(地址,回调函数)
public void post(String url,Callback callback){
requestMethod = "POST";
serverUrl = url;
handleData(null,callback);
}
// post请求(地址,map参数,回调函数)
public void post(String url,Map<String,Object> params,Callback callback){
requestMethod = "POST";
serverUrl = url;
handleData(params,callback);
}
// post请求(地址,map参数,回调函数)
public void post(String url,Object params,Callback callback) {
requestMethod = "POST";
serverUrl = url;
handleData(objectToMap(params),callback);
}
// 初始化参数
private void init(){
requestMethod = "GET";
useCaches = false;
connectTimeout = 3000;
encode="utf-8";
} //handle中操作页面,以及创建线程
private void handleData(Map<String, Object> params, Callback callback){
@SuppressLint("HandlerLeak")
android.os.Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
callback.onSuccess((String) msg.obj);
}
};
new Thread(new Runnable(){
@Override
public void run() {
submitAllData(params,callback,handler);
}
}).start();
}
// 博客园-依旧淡然
//HttpUtils.submitPostData(params, "utf-8")
private void submitAllData(Map<String, Object> params, Callback callback,Handler handler){
String data = null;
if (params!=null) {
data = getRequestData(params, encode).toString();
}
try {
if(requestMethod.equals("GET") && data != null){
serverUrl += '?'+data;
}
URL url = new URL(serverUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(requestMethod);//方式
connection.setConnectTimeout(connectTimeout);//超时
if(requestMethod.equals("POST")){
connection.setDoInput(true);//向服务器输入
connection.setDoOutput(true);//向服务器输出
connection.setUseCaches(useCaches);//缓存
//设置请求体的类型是文本类型
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置请求体的长度
connection.setRequestProperty("Content-Length", String.valueOf(data.getBytes().length));
//获得输出流,向服务器写入数据
OutputStream outputStream = connection.getOutputStream();
outputStream.write(data.getBytes());
}
int response = connection.getResponseCode(); //获得服务器的响应码
if(response == HttpURLConnection.HTTP_OK) {
InputStream inptStream = connection.getInputStream();
Message message = new Message();
message.obj = dealResponseResult(inptStream); //处理服务器的响应结果
handler.sendMessage(message);
}else {
callback.onFailed("Error: response is" + response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 博客园-依旧淡然
private static StringBuffer getRequestData(Map<String, Object> params, String encode) {
StringBuffer stringBuffer = new StringBuffer(); //存储封装好的请求体信息
try {
for(Map.Entry<String, Object> entry : params.entrySet()) {
stringBuffer.append(entry.getKey())
.append("=")
.append(Uri.encode(entry.getValue().toString(), encode))
.append("&");
}
stringBuffer.deleteCharAt(stringBuffer.length() - 1); //删除最后的一个"&"
} catch (Exception e) {
e.printStackTrace();
}
return stringBuffer;
}
// 博客园-依旧淡然
private static String dealResponseResult(InputStream inputStream) {
String resultData = null; //存储处理结果
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
try {
while((len = inputStream.read(data)) != -1) {
byteArrayOutputStream.write(data, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
resultData = new String(byteArrayOutputStream.toByteArray());
return resultData;
}
// 回调函数
public interface Callback{
void onSuccess(String res);
void onFailed(String err);
} /**
* @Description: java类型转为map类型
* @Param: [obj]
* @return: java.util.Map<java.lang.String,java.lang.Object>
* @Date: 2021/3/11
*/
public static Map<String, Object> objectToMap(Object obj) {
Map<String, Object> map = new HashMap<String,Object>();
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String fieldName = field.getName();
Object value = null;
try {
value = field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
map.put(fieldName, value);
}
return map;
} // 请求方式
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
// 使用缓存
public void setUseCaches(boolean useCaches) {
this.useCaches = useCaches;
}
// 请求地址
public void setServerUrl(String serverUrl) {
this.serverUrl = serverUrl;
}
// 请求参数
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
// 编码方式
public void setEncode(String encode) {
this.encode = encode;
}
}

作者:咕魂

时间:2021年3月11日14:08:55

参考代码:Android学习笔记46:使用Post方式提交数据

基于HttpURLConnection的android http请求封装的更多相关文章

  1. Android Http请求

    Android HTTP请求封装代码 /** * This class is the Utils of other classes. */ public class HttpUtil { /** 变量 ...

  2. android 网络编程之HttpURLConnection与HttpClient使用与封装

    1.写在前面     大部分andriod应用需要与服务器进行数据交互,HTTP.FTP.SMTP或者是直接基于SOCKET编程都可以进行数据交互,但是HTTP必然是使用最广泛的协议.     本文并 ...

  3. Android之Http通信——3.Android HTTP请求方式:HttpURLConnection

    3.Android HTTP请求方式之HttpURLConnection 引言: 好了,前两节我们已经对HTTP协议进行了学习.相信看完前两节的朋友对HTTP协议相比之前 应该更加熟悉吧.好吧.学了要 ...

  4. android网络编程之HttpUrlConnection的讲解--POST请求

    1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...

  5. android网络编程之HttpUrlConnection的讲解--GET请求

    1.服务器后台使用Servlet开发,这里不再介绍. 2.测试机通过局域网链接到服务器上,可以参考我的博客:http://www.cnblogs.com/begin1949/p/4905192.htm ...

  6. 简单的基于Vue-axios请求封装

    具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...

  7. Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:

    Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ...

  8. uniapp 基于 flyio 的 http 请求封装

    之前写请求都是用别人封装好的,直接 import request 完事,自己第一次写还是一头雾水,学习了一波搞清楚了些,可以写简单的封装了. 首先要搞清楚为什么封装请求,同其他的封装一样,我们把不同请 ...

  9. WebApi系列~基于单请求封装多请求的设计

    回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...

  10. webapi基于单请求封装多请求的设计【转】

    怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能包含多个子 ...

随机推荐

  1. 【经验】微信小程序|云后台比价(自带云开发、leancloud、bmob)(2022/10/31更新)

    这个博客UI不太好看,我另外也发在了博客园里,可点击链接查看. 文章目录 前言 1. 免费配额 2. 超过额度时收费情况 3. 另外的价钱 总结 前言 作为前端开发者,没有购买云服务器的习惯,在只需要 ...

  2. 【HUST】网安|编译原理实验|实验四攻略

    [实验代码及报告地址:Gitee传送门](已关闭传送大门,原因是抄袭过多,如需参考,请直接看博客,虽然下一届内容会变了) 不擅长写报告昂,很多地方能省全省了. 助力来年编译原理加大难度!(hhh) M ...

  3. MNIST实例-Tensorflow 初体验

    目的还是熟悉这种 tensorflow 框架的基本流程, 即如何导包, 反正我神经网络相关的一些经典理论, BP推导呀, 卷积神经网络呀, 递归神经网络这些的数学原理, 我已经基本推导一遍了, 已基本 ...

  4. golang random string

    package main import ( "math/rand" "strings" "testing" "time" ...

  5. qt动画类学习

    Qt动画类 QPropertyAnimation 显示动画 QPropertyAnimation *animation = new QPropertyAnimation(window(), " ...

  6. JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

    摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏. 引言   线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM.今天我们来一起学习 ...

  7. 集合操作交并补的三种Java实现

    基本概念 为了便于理解,下面首先介绍集合的三个基本操作:并集.交集和补集.   并集:以属于A或属于B的元素为元素的集合称为A与B的并(集),记作A∪B(或B∪A),读作"A并B" ...

  8. IDEA terminal控制台配置git bash及中文乱码问题

    1.修改控制台shell路径:setting -> Tools -> Terminal -> Shell path,修改为git安装路径. 修改完毕,在控制台输入exit断开sess ...

  9. Burp Suite 企业级深度实战教程

    第一部分:环境搭建与高级配置 1.1 专业版激活与插件生态 # 专业版激活(Linux) java -jar -Xmx2048m burpsuite_pro.jar --activate --acti ...

  10. 2023人形全能赛v831代码(包括YOLOv2识别和扫码以及颜色识别)

    v831 import time, math from maix import nn, camera, display, image import serial class YOLOv2: def _ ...