okhttp网络请求工具

 先依赖

implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
implementation 'com.google.code.gson:gson:2.8.0'

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;import com.artvrpro.yiwei.MyApplication;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;/*** *okhttp网络请求工具* * */
public class HttpUtils {private static OkHttpClient client = null;private HttpUtils() {}public static OkHttpClient getInstance() {if (client == null) {synchronized (HttpUtils.class) {if (client == null)client = new OkHttpClient().newBuilder().connectTimeout(60, TimeUnit.SECONDS)//设置连接超时时间  AI生图时长超过10秒,不设置会访问失败,timeout.readTimeout(60, TimeUnit.SECONDS)//设置读取超时时间.build();;}}return client;}/*** 判断网络** @param context* @return*/public static int isConnNetWork(Context context) {ConnectivityManager conManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo network = conManager.getActiveNetworkInfo();if (network != null) {if (!conManager.getActiveNetworkInfo().isAvailable()) {return 1;}if (conManager.getActiveNetworkInfo().isConnected()) {return 3;}if (conManager.getActiveNetworkInfo().isConnectedOrConnecting()) {return 2;}}return 1;}/*** Get请求** @param url* @param callback*/public static void doGet(String url, Callback callback) {Log.e("ceshia", isConnNetWork(MyApplication.mContext) + "--------------");if (1 != isConnNetWork(MyApplication.mContext)) {Request request = new Request.Builder().url(url).addHeader("x-shinemi-auth", SPUtils.get("token","")+"").build();Call call = getInstance().newCall(request);call.enqueue(callback);} else {Toast.makeText(MyApplication.mContext, "网络断开,请打开网络", Toast.LENGTH_SHORT).show();}}/*** Post请求发送键值对数据** @param url* @param mapParams* @param callback*/public static void doPost(String url, Map<String, String> mapParams, Callback callback) {if (1 != isConnNetWork(MyApplication.mContext)) {FormBody.Builder builder = new FormBody.Builder();for (String key : mapParams.keySet()) {builder.add(key, mapParams.get(key));}Request request = new Request.Builder().url(url).post(builder.build()).build();Call call = getInstance().newCall(request);call.enqueue(callback);} else {Toast.makeText(MyApplication.mContext, "网络断开,请打开网络", Toast.LENGTH_SHORT).show();}}
/*
*//*** 表单,上传图片*//*public static void doFileKey(String key, File cropFile, Callback callback){RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart(key, IMAGE_FILE_NAME_TEMP,RequestBody.create(MEDIA_TYPE_PNG,cropFile )).build();Request request = new Request.Builder().header("Authorization", "Client-ID " + "9199fdef135c122").url("http://monan.antiphon168.com/Doctor/Index/uploadThumbImage?").post(requestBody).build();Call call = getInstance().newCall(request);call.enqueue(callback);}*//*** Post请求发送JSON数据** @param url* @param jsonParams* @param callback*/public static void doPost(String url, String jsonParams, Callback callback) {if (1 != isConnNetWork(MyApplication.mContext)) {RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);Request request = new Request.Builder().url(url).addHeader("x-shinemi-auth", SPUtils.get("token","")+"").post(body).build();Call call = getInstance().newCall(request);call.enqueue(callback);} else {Toast.makeText(MyApplication.mContext, "网络断开,请打开网络", Toast.LENGTH_SHORT).show();}}/*** 上传文件** @param url* @param pathName* @param fileName* @param callback*/public static void doFile(String url, String pathName, String fileName, Callback callback) {//判断文件类型MediaType MEDIA_TYPE = MediaType.parse(judgeType(pathName));//创建文件参数MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart(MEDIA_TYPE.type(), fileName,RequestBody.create(MEDIA_TYPE, new File(pathName)));//发出请求参数Request request = new Request.Builder().header("Authorization", "Client-ID " + "9199fdef135c122").url(url).post(builder.build()).build();Call call = getInstance().newCall(request);call.enqueue(callback);}/*** Post上传图片的参数** @param BodyParams* @param fileParams* @return*/private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");public static RequestBody SetFileRequestBody(Map<String, String> BodyParams, Map<String, String> filePathParams) {// 带文件的Post参数RequestBody body = null;MultipartBody.Builder MultipartBodyBuilder = new MultipartBody.Builder();MultipartBodyBuilder.setType(MultipartBody.FORM);RequestBody fileBody = null;if (BodyParams != null) {Iterator<String> iterator = BodyParams.keySet().iterator();String key = "";while (iterator.hasNext()) {key = iterator.next().toString();MultipartBodyBuilder.addFormDataPart(key, BodyParams.get(key));}}if (filePathParams != null) {Iterator<String> iterator = filePathParams.keySet().iterator();String key = "";int i = 0;while (iterator.hasNext()) {key = iterator.next().toString();i++;MultipartBodyBuilder.addFormDataPart(key, filePathParams.get(key));fileBody = RequestBody.create(MEDIA_TYPE_PNG, new File(filePathParams.get(key)));MultipartBodyBuilder.addFormDataPart(key, i + ".png", fileBody);}}body = MultipartBodyBuilder.build();Log.e("bodybodybodee", body + "");return body;}/*** 根据文件路径判断MediaType** @param path* @return*/private static String judgeType(String path) {FileNameMap fileNameMap = URLConnection.getFileNameMap();String contentTypeFor = fileNameMap.getContentTypeFor(path);if (contentTypeFor == null) {contentTypeFor = "application/octet-stream";}return contentTypeFor;}/*** 下载文件** @param url* @param fileDir* @param fileName*/public static void downFile(String url, final String fileDir, final String fileName) {Request request = new Request.Builder().url(url).build();Call call = getInstance().newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {InputStream is = null;byte[] buf = new byte[2048];int len = 0;FileOutputStream fos = null;try {is = response.body().byteStream();File file = new File(fileDir, fileName);fos = new FileOutputStream(file);while ((len = is.read(buf)) != -1) {fos.write(buf, 0, len);}fos.flush();} catch (IOException e) {e.printStackTrace();} finally {if (is != null) is.close();if (fos != null) fos.close();}}});}
}

使用方法:

post请求:

 final Gson gson = new Gson();String jsontype = gson.toJson(dataBean);    //把数据实体类转成json字符串HttpUtils.doPost("接口地址", jsontype, new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.d("AiCreativityPicBean", e.toString() + "----------");}@Overridepublic void onResponse(Call call, Response response) throws IOException {String info = response.body().string();Log.d("AiCreativityPicBean", info + "----------");aiCreativityPicBeanResponse = gson.fromJson(info, AiCreativityPicBeanResponse.class);}});}

get请求:

   HttpUtils.doGet("请求接口", new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.d("AiCreativityPicBean", e.toString() + "----------");}@Overridepublic void onResponse(Call call, Response response) throws IOException {String info = response.body().string();Log.d("AiCreativityPicBean", info + "----------");aiCreativityPicBeanResponse = gson.fromJson(info, AiCreativityPicBeanResponse.class);}});

序列化工具:

import com.google.gson.Gson;public class GsonUtil {private static Gson mGson = new Gson();/*** 序列化* @param json  json字符串* @param classOfT 实体类* @return*/@SuppressWarnings("unchecked")public static Object toObject(String json, Class classOfT) {return mGson.fromJson(json, classOfT);}/*** 反序列化* @param object* @param <T>* @return*/public static <T> String toJson(T object) {return mGson.toJson(object);}}

使用:

ExhibitionWorkDetailsBean exhibitionWorkDetailsBean = (ExhibitionWorkDetailsBean) GsonUtil.toObject(resultJson/*json字符串*/,ExhibitionWorkDetailsBean.class);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 应用程序中实现单例模式

要在 WPF 应用程序中实现单例模式&#xff0c;确保应用程序在任意时刻只有一个实例运行&#xff0c;您可以在 App.xaml.cs 的 OnStartup 方法中检查是否已有应用程序实例在运行。如果是&#xff0c;那么可以阻止新实例的启动&#xff0c;并将焦点转移到现有实例&#xff0c;或者…

SSD PCIe接口综述

SSD 的接口当前以PCIe为主&#xff0c;因为其速度远快于SATA接口。 PCIe 特征 已经从PCIe1.0发展到了6.0, 其中3.0的双向带宽&#xff1a;单通道&#xff08;Lane&#xff09;为2GB/s, 32通道为64GB/s全双工模式&#xff0c;发送和接收通道可以同时工作&#xff08;SATA为半双…

python3基础知识-学习目录

本次学习的内容是以python3.X为平台&#xff0c;详细的阐述python编程的基础知识和高级技巧。虽然之前学习过相关的知识&#xff0c;但是并未真正掌握python的原理&#xff0c;此次的学习更是为了加深自己的印象&#xff0c;并更深入的理解python的高阶知识。 为了学习效率更好…

【python入门】day12:bug及其处理思路

bug的常见类型 粗心 / 没有好习惯 思路不清 lst[{rating:[9.7,2062397],id:1292052,type:[犯罪,剧情],title:肖申克的救赎,actors:[蒂姆罗宾斯,摩根弗里曼]},{rating:[9.6,1528760],id:1291546,type:[剧情,爱情,同性],title:霸王别姬,actors:[张国荣 ,张丰毅 , 巩俐 ,葛优]},{r…

redis重启后数据丢失问题解决(亲测好用)

redis修改密码重启后发现redis中的数据丢失了 解决办法&#xff1a; 首先在redis的安装目录下查找重启之前的dump.rdb文件&#xff0c;发现只有当天的一个dump.rdb文件&#xff0c;确认不是重启备份的文件 然后我就全盘找一下dump.rdb的备份文件&#xff0c;找到前一天的备份…

喜讯丨上海和今信息科技有限公司入选2023年上海市专精特新中小企业名单

近日&#xff0c;上海市经济和信息化委员会公示了 2023 年上海市专精特新中小企业名单&#xff0c;上海和今信息科技有限公司凭借多年专注数据智能领域、领先的产品技术实力、专业的创新研发能力以及卓越的行业影响力&#xff0c;顺利通过专家评审和综合评估&#xff0c;荣获上…

WRF进阶:使用Grid Nudging同化Upper-air

Nudging Nudging是一种应用较为广泛的同化方法&#xff0c;通过在控制方程中加上强迫项&#xff0c;逐渐把模式状态向观测状态逼近。这些强迫项相对于方程中的各项量级较小&#xff0c;保证了在每个积分步长中各物理量之间的动力平衡&#xff08;Stauffer D R, Seaman N L. 19…

MO 2023 年度回顾

PART-ONE 行业态势 随着供需关系的变化&#xff0c;数据库的竞争在经历了 3 年 “百花齐放” 般的发展后&#xff0c;终于在 2023 年进入到了一个相对收拢的阶段。 2023 年&#xff0c;各个数据库厂商间很有默契地在两个方面达成了一致&#xff1a; HTAP 已经成为新一代数据…

源码安全静态扫描工具对比

Checkmarx CxSuite 介绍参见&#xff1a;https://cloud.tencent.com/developer/article/2249914 这家报价接近90W人民币/ 一年&#xff0c;据我们联系的人说 这家销售觉得我们预算不够&#xff0c;高高在上。。。。 sonarqube 参见&#xff1a;GitHub - SonarSource/sonarqu…

【Storm实战】1.2 图解Storm的架构及其组件

文章目录 0. 前言1. 图解架构及其组件2. Storm的主要架构组件 0. 前言 上一章节&#xff0c;我们为了好理解&#xff0c;将storm中的抽象概念 通过画了一个水力发电系统的工作模式&#xff0c;相信大家一定可以直观地理解Storm中的流 (Stream) 、拓扑 (Topology)、Spout、Bolt…

How to understand DataArts Insight in Huawei Cloud

How to understand DataArts Insight in Huawei Cloud 概述什么是DataArts Insight为什么选择华为云DataArts Insight多业务场景全覆盖&#xff0c;实现企业智能分析产品架构产品功能数据接入数据加工仪表板数据大屏交互式分析嵌入式分析智能分析助手智能洞察BI内存引擎企业级数…

编译好的opencv3.1.0_mingw版下载可用

网上转载&#xff1a;感谢网友提供&#xff0c;学习啦&#xff01; 最近正在学习OpenCV &#xff0c;为毕业设计做准备。Windows版本的OpenCV都默认提供对VS的支持&#xff0c;其在VS中的配置比较简单&#xff0c;网上也有大批教程详细描述了配置步骤。但在使用Qt Creator时的…

Vue中的计算属性与监听器

聚沙成塔每天进步一点点 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每篇文章都致力于提供清晰、深入的参考资料,让你能够更轻松、更自信地理解和掌握 Vue.js 的核心概念和技…

vite项目配置项目可通过局域网访问

vite.config.js配置如下 import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({server: {port: 3001, // 访问端口号host: 0.0.0.0, // 配置项目可以局域网访问cors: true, // 默认启用并允许任何源plugins: [vue()],base: ./, …

大数据开发与低代码:加速数据处理与解决方案开发

随着数据量的爆炸式增长&#xff0c;大数据开发变得愈发重要。然而&#xff0c;传统的大数据开发方法往往需要复杂的编码和开发过程&#xff0c;消耗时间和资源。而低代码开发平台的出现为大数据开发带来了全新的解决方案。本文将介绍大数据开发和低代码的概念&#xff0c;并探…

python的课后练习总结4(while循环)

for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. i 1while i < 5:print(i)i i 11、使用wh…

WMS仓储管理系统与WCS系统:功能差异与特点对比

在物流行业的现代化管理中&#xff0c;WMS仓储管理系统和WCS仓库控制系统扮演着举足轻重的角色。虽然它们都是仓库管理软件系统&#xff0c;但是它们在功能和应用场景上存在显著的差异。本文将详细阐述这两者的功能和区别。 一、WMS仓储管理系统 WMS是一种综合性的软件系统&…

制药企业符合CSV验证需要注意什么?

在制药行业中&#xff0c;计算机化系统验证&#xff08;CSV&#xff09;是确保生产过程的合规性和数据完整性的关键要素。通过CSV验证&#xff0c;制药企业可以保证其计算机化系统的可靠性和合规性&#xff0c;从而确保产品质量和患者安全。然而&#xff0c;符合CSV验证并不是一…

通过回答自然语言问题进行事件抽取(EMNLP2020)

1、写作动机&#xff1a; 以往的事件抽取方法都基于神经网络模型抽取的密集特征和预训练语言模型的上下文表示。但是&#xff0c;它们&#xff08;1&#xff09;严重依赖实体识别进行事件论元抽取&#xff0c;特别是通常需要采用多步骤方法来进行事件论元抽取。&#xff08;2&…

Android linephone-android sdk设置语音编码问题

1.遇到的问题 今天遇到linphone-android sdk需要解决语音编码问题&#xff0c;需要指定编码。查了下配置&#xff0c;里面没有发现类似的配置。 ## Start of factory rc # This file shall not contain path referencing package name, in order to be portable when app is r…