基于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. 【HUST】网安|操作系统实验|实验四 设备管理、文件管理

    文章目录 任务 任务1 编写一个Linux内核模块,并完成安装/卸载等操作. 1. 提示 2. 任务代码 3. 结果及说明 任务2 编写Linux驱动程序并编程应用程序测试. 1. 提示 2. 任务代 ...

  2. Unity ML-Agents实战指南:构建多技能游戏AI训练系统

    引言:游戏AI训练的技术演进 在<赛博朋克2077>的动态NPC系统到<Dota 2>OpenAI Five的突破性表现中,强化学习正在重塑游戏AI边界.本文将通过Unity ...

  3. vivo 互联网研发效能关键技术与实践

    作者: vivo 互联网研发效能团队 Yang Peng.Huang Fengjin 本文为2024年 vivo 开发者大会互联网技术专场分享内容之一,在公众号对话框回复[2024VDC]获取 202 ...

  4. BootStrap CDN收藏,矢量图标

    <!-- 新 Bootstrap 核心 CSS 文件 --> <link href="https://cdn.staticfile.org/twitter-bootstra ...

  5. c语言笔记(翁凯男神

    哼,要记得好好学习去泡帅哥吖 一.快速入门 %p 输出地址 #include <stdio.h> void f(int *p); int main(){ int i = 1; printf ...

  6. ActiveMQ消息投递方式+死信队列

    死信队列 死信队列(Dead Letter Queue,DLQ),用来保存处理失败或者过期的信息.出现以下情况的时候,消息会被重发: 在一个事务session中调用了session.rollback( ...

  7. ubuntu22.04使用libmysqlclient-dev,在包含mysql.h时会出现‘net_async_status’未声明

    //mysql Ver 8.0.41-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu)) //库文件是libmysqlclient-dev //在使用 g+ ...

  8. 【2020.11.24提高组模拟】变换 (transform) 题解

    [2020.11.24提高组模拟]变换 (transform) 题解 题意描述 给一个大小为\(n\)的\(01\)环\(A\),点编号为\(0,1,\dots,n-1\).每一个点\(i\)都与\( ...

  9. HarmonyOS 实战:给笔记应用加防截图水印

    最近在做笔记类应用时,遇到一个头疼的需求:防止用户内容被非法截图传播.思来想去,加水印是个直接有效的方案.研究了 HarmonyOS 的开发文档后,发现用 Canvas 配合布局组件能轻松实现动态水印 ...

  10. java把mysql的数据同步到prometheus

    1.mysql的数据  2.java代码  建立指标Collector类,指标类必须继承Collector import cn.hutool.extra.spring.SpringUtil; impo ...