基于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. VUE3中的组件通信

    工作中使用组件之间传值在此记录 目录VUE3中的组件通信六种方法介绍与基本使用一.父传子(props)二. Emits 传值(子组件向父组件传值)三.v-model 双向绑定四. provide/in ...

  2. MySQL高可用搭建方案之MHA

    MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL ...

  3. codeup之比较奇偶数个数

    Description 第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES. Input 输入有多组数据. 每组输入n,然后输入n个整数(1<=n& ...

  4. 赛前十天——打印输入字符串的全排列&&cls(java实现)

    package javaPractice; import java.util.Scanner; public class Contest13 { public static void main(Str ...

  5. 洛谷 P4820 [国家集训队]书堆

    题目描述 让N本密度均匀的相同的书摆在桌上.最下面的摆在桌子边缘,其他的书依次堆叠在一本书上.每本书都只能水平放置,宽必须垂直于桌子边缘.如(洛谷的)图: 求书本最右能到多远(这个距离是指最右边的书的 ...

  6. Prometheus配置文件详解

    概述 Prometheus是一个开源的系统监控和警报工具包.它的配置文件通常命名为prometheus.yml,用于配置Prometheus服务器的行为. 其配置文件主要包含以下几个部分: globa ...

  7. 「Note」图论方向 - 图论进阶

    1. 2-SAT 1.1. 介绍 对于一些节点,每个节点存在两个状态(非 \(0\) 即 \(1\)),我们给出一些如下类型的限制条件: 节点 \(i\) 状态为 \(1/0\). 若节点 \(i\) ...

  8. 题解:P1763 埃及分数

    题目链接:link. 先放上代码,然后再讲解: #include<bits/stdc++.h> using namespace std; typedef long long ll; ll ...

  9. gitlabci之gitlab runner部署配置

    gitlab runner部署 部署方案可以采用gitlab runner operator部署,也可以直接使用gitlab helm charts部署. runner配置说明 对于k8s gitla ...

  10. 垃圾PTA:7-3 输出数组元素 (15分)

    本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果. 输入格式: 输入的第一行给出正整数n(1<n≤10).随后一行给出n个整数,其间以空格分隔. 输 ...