okhttp_utils的使用以及与服务端springboot交互中遇到的问题

okhttp_utils的使用以及与服务端springboot交互中遇到的问题

  • 1_okhttp_utils在Android studio中的引入方法
  • 2_okhttputils的使用举例
  • 3_get和post的简单使用
  • 3_图片的上传
    • 3.1_单张图片的上传
      • 3.1.1_获取安卓本地图片问题
      • 3.1.2_okhttputils上传图片代码
      • 3.1.3_服务端接收图片
    • 3.2_单张图片带参数上传
  • 4_图片的下载

1_okhttp_utils在Android studio中的引入方法

1.在app目录下的build.gradle中添加

    // 添加OKHttp支持implementation("com.squareup.okhttp3:okhttp:4.3.1")implementation 'com.zhy:okhttputils:2.6.2'

在这里插入图片描述
2.创建新activity项目“MyApplication”

package com.example.myapplication;import android.app.Application;
import com.zhy.http.okhttp.OkHttpUtils;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;public class MyApplication extends Application
{@Overridepublic void onCreate(){super.onCreate();OkHttpClient okHttpClient = new OkHttpClient.Builder()
//                .addInterceptor(new LoggerInterceptor("TAG")).connectTimeout(10000L, TimeUnit.MILLISECONDS).readTimeout(10000L, TimeUnit.MILLISECONDS)//其他配置.build();OkHttpUtils.initClient(okHttpClient);}
}

3.callBack函数可自己定义(用来获取请求后服务端返回的数据)

public class MyStringCallback extends StringCallback{@Overridepublic void onBefore(Request request, int id){setTitle("loading...");}@Overridepublic void onAfter(int id){setTitle("Sample-okHttp");}@Overridepublic void onError(Call call, Exception e, int id){e.printStackTrace();Log.i("onError:",e.getMessage());}@Overridepublic void onResponse(String response, int id){Log.e(TAG, "onResponse:complete");Log.i("onResponse:",response);switch (id){case 100:Toast.makeText(MainActivity.this, "http", Toast.LENGTH_SHORT).show();break;case 101:Toast.makeText(MainActivity.this, "https", Toast.LENGTH_SHORT).show();break;}}}

2_okhttputils的使用举例

下载实例代码sampleOkhttp
在这里插入图片描述

3_get和post的简单使用

主要是路径url参数问题,对于post方法无需写?account=…&password=…

 /*get方法登录*/public void loginGet(final String account, final String password){String url = "http://10.200.231.191:8081"+"/UserServer/loginByAccount?account="+account+"&password="+password;OkHttpUtils.get().url(url).build().execute(new StringCallback(){@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(String response, int id) {Log.i("tag",response);}});}/*post方法登录*/public void loginPost(final String account, final String password){String url = "http://10.200.231.191:8081"+"/UserServer/loginByAccount";OkHttpUtils.post().url(url).addParams("account", account).addParams("password", password).build().execute(new StringCallback(){@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(String response, int id) {Log.i("tag",response);}});}

3_图片的上传

3.1_单张图片的上传

3.1.1_获取安卓本地图片问题

获取手机本地文件和电脑操作略有不同,由于每部手机路径都可能不一样,所以先使用函数getFilesDir()/getCacheDir()/getExternalFilesDir()/getExternalCacheDir()/StorageDirectory()获取路径,然后进行文件操作

com.example.fang.test E/getFilesDir(): /data/user/0/com.example.fang.test/files/aa
com.example.fang.test E/getCacheDir(): /data/user/0/com.example.fang.test/cache/aa
com.example.fang.test E/getExternalFilesDir(): /storage/emulated/0/Android/data/com.example.fang.test/files/aa
com.example.fang.test E/getExternalCacheDir(): /storage/emulated/0/Android/data/com.example.fang.test/cache/aa
com.example.fang.test E/StorageDirectory(): /storage/emulated/0/aa

获取文件操作转载

示例

Log.i("tag",Environment.getExternalStorageDirectory().toString());File file = new File(Environment.getExternalStorageDirectory()+"/Pictures", "dabai.jpg");//读取getExternalStorageDirectory()路径下Pictures文件夹下的图片if (!file.exists()){Toast.makeText(MainActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();return;}

Log.i("tag",Environment.getExternalStorageDirectory().toString());输出结果:
在这里插入图片描述

在这里插入图片描述

3.1.2_okhttputils上传图片代码

public void convertPicture(File file) {String url = "http://10.200.231.191:8081" + "/UserServer/getPicture";Map<String, String> headers = new HashMap<>();OkHttpUtils.post()//.url(url)//.addFile("pictureFile","xixi.jpg", file)//可以写多条语句上传多张图片.build()//.execute(new MyStringCallback());}

url是服务端路径;
addFile(“pictureFile”,“xixi.jpg”, file)中的pictureFile是服务端的value名
在这里插入图片描述

3.1.3_服务端接收图片

服务端接收图片并不是File类型的,若写成File会报错,具体原因见MultipartFile与File详解与相互转换

服务端代码:
Controller:

/*获取图片*/@RequestMapping(value = "getPicture",method = RequestMethod.POST)public void getPicture(@RequestParam(value = "pictureFile") MultipartFile multipartFile){System.out.println("收到");FileOperation.multipartfileToFile(multipartFile);return ;}

FileOperation:

public class FileOperation {static String multipartfileToFilePath = "C:\\Users\\Administrator\\Desktop\\wode\\最近有用";
/*将客户端传来的MultipartFile类型的图片转换为File并存储到路径multipartfileToFilePath*/public static void multipartfileToFile(MultipartFile multipartFile){try{File file = new File(multipartfileToFilePath,"demo.jpg");multipartFile.transferTo(file);// 读取文件第一行BufferedReader bufferedReader = new BufferedReader(new FileReader(file));System.out.println(bufferedReader.readLine());// 输出绝对路径System.out.println(file.getAbsolutePath());bufferedReader.close();}catch (Exception e){System.out.println("FileOperationServer:"+e.toString());}}
}

3.2_单张图片带参数上传

客户端:

/*带参数上传一张图片*/public void convertPictureAndParam(int userId,float longitude,float latitude,String text,File file) {String url = "http://10.200.231.191:8081" + "/PointServer/savePoint";Map<String, String> headers = new HashMap<>();OkHttpUtils.post()//.url(url)//.addParams("userId",Integer.toString(userId)).addParams("longitude",Float.toString(longitude)).addParams("latitude",Float.toString(latitude)).addParams("text",text).addFile("pictureFile","xixi.jpg", file).build()//.execute(new StringCallback()//返回响应{@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(String response, int id) {Log.i("tag",response);}});}

服务端:

@RestController
@RequestMapping("PointServer")
public class PointController {@RequestMapping(value = "savePoint",method = RequestMethod.POST)public int savePoint(@RequestParam(value = "userId") int userId,@RequestParam(value = "longitude") float longitude,@RequestParam(value = "latitude") float latitude,@RequestParam(value = "text") String text,@RequestParam(value = "pictureFile")MultipartFile multipartFile){String pictureName = UUID.randomUUID().toString()+".jpg";//通过UUID类(表示通用唯一标识符的类)获得唯一值,UUID表示一个128位的值FileOperation.multipartfileToFile(multipartFile,pictureName);return new PointServer().savePoint(userId,longitude,latitude,text,pictureName);}
}

其中FileOperation.multipartfileToFile(multipartFile,pictureName);用于存储图片

4_图片的下载

客户端:

/*下载图片*/public void getPicture(){String url = "http://10.200.231.191:8081" + "/PointServer/image";OkHttpUtils.get().url(url).build().execute(new BitmapCallback()//服务器返回响应{@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(Bitmap response, int id) {Log.i("picture",response.getClass().toString());mImageView.setImageBitmap(response);//显示在控件mImageView上}});}

服务端:

 @GetMapping(value = "image",produces = MediaType.IMAGE_JPEG_VALUE)@ResponseBodypublic byte[] test() throws Exception {File file = new File(FileOperation.readPicturePath,"4d5c3e33-67c2-4e66-9939-e97a3f49c36f.jpg");FileInputStream inputStream = new FileInputStream(file);byte[] bytes = new byte[inputStream.available()];inputStream.read(bytes, 0, inputStream.available());return bytes;}

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

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

相关文章

算法系列之图--DFS

深度优先搜索使用的策略是&#xff0c;只要与可能就在图中尽量“深入”。DFS总是对最近才发现的结点v出发边进行探索&#xff0c;知道该结点的所有出发边都被发现为止。一旦v的所有出发边都被发现了&#xff0c;搜索就回溯到v的前驱结点&#xff08;v是经该结点才被发现的&…

这8种常见的SQL错误用法,你还在用吗?

来源 | yq.aliyun.com/articles/72501MySQL 在近几年仍然保持强劲的数据库流行度增长趋势。越来越多的客户将自己的应用建立在 MySQL 数据库之上&#xff0c;甚至是从 Oracle 迁移到 MySQL上来。但也存在部分客户在使用 MySQL 数据库的过程中遇到一些比如响应时间慢&#xff0c…

千万不要这样写代码!9种常见的OOM场景演示

《Java虚拟机规范》里规定除了程序计数器外&#xff0c;虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能&#xff0c;我们本文就来演示一下这些错误的使用场景。一. StackOverflowError1.1 写个 bugpublic class StackOverflowErrorDemo {public static v…

MySQL数据库安装与配置详解

目录 一、概述 二、MySQL安装 三、安装成功验证 四、NavicatforMySQL下载及使用 一、概述 MySQL版本&#xff1a;5.7.17 下载地址&#xff1a;http://rj.baidu.com/soft/detail/12585.html?ald 客户端工具&#xff1a;NavicatforMySQL 绿色版下载地址&#xff1a;http://www.c…

求求你,不要再使用!=null判空了!

对于Java程序员来说&#xff0c;null是令人头痛的东西。时常会受到空指针异常&#xff08;NPE&#xff09;的骚扰。连Java的发明者都承认这是他的一项巨大失误。那么&#xff0c;有什么办法可以避免在代码中写大量的判空语句呢&#xff1f;有人说可以使用 JDK8提供的 Optional …

JDBC(Java语言连接数据库)

JDBC&#xff08;Java语言连接数据库&#xff09;JDBC本质整体结构基层实现过程&#xff08;即用记事本而不是idea&#xff09;第一种实现方式第二种实现方式乐观锁和悲观锁乐观锁悲观锁JDBC本质 整体结构 基层实现过程&#xff08;即用记事本而不是idea&#xff09; 第一种实…

那些牛逼的数据分析师,SQL用的到底有多溜

从各大招聘网站中可以看到&#xff0c;今年招聘信息少了很多&#xff0c;但数据分析相关岗位有一定增加&#xff0c;而数据分析能力几乎已成为每个岗位的必备技能。是什么原因让企业如此重视“数据人才”&#xff1f;伴随滴滴出行、智慧营销等的落地商用&#xff0c;部分企业尝…

knn机器学习算法_K-最近邻居(KNN)算法| 机器学习

knn机器学习算法Goal: To classify a query point (with 2 features) using training data of 2 classes using KNN. 目标&#xff1a;使用KNN使用2类的训练数据对查询点(具有2个要素)进行分类。 K最近邻居(KNN) (K- Nearest Neighbor (KNN)) KNN is a basic machine learning…

Linux 指令的分类 (man page 可查看)

man page 常用按键 转载于:https://www.cnblogs.com/aoun/p/4324350.html

Springboot遇到的问题

Springboot遇到的问题1_访问4041.1_url错误1.2_controller和启动项不在同级目录1.3_未加ResponseBody2_字母后端显示大写&#xff0c;传到前端变为小写2.1_Data注释问题1_访问404 1.1_url错误 1.2_controller和启动项不在同级目录 1.3_未加ResponseBody 在方法上面加&#…

45 张图深度解析 Netty 架构与原理

作为一个学 Java 的&#xff0c;如果没有研究过 Netty&#xff0c;那么你对 Java 语言的使用和理解仅仅停留在表面水平&#xff0c;会点 SSH 写几个 MVC&#xff0c;访问数据库和缓存&#xff0c;这些只是初等 Java 程序员干的事。如果你要进阶&#xff0c;想了解 Java 服务器的…

ajax实现浏览器前进后退-location.hash与模拟iframe

为什么80%的码农都做不了架构师&#xff1f;>>> Aajx实现无数据刷新时&#xff0c;我们会遇到浏览器前进后退失效的问题以及URL不友好的问题。 实现方式有两种 1、支持onhashchange事件的&#xff0c;通过更新和读取location.hash的方式来实现 /* 因为Javascript对…

java环境变量配置以及遇到的一些问题

java环境变量配置以及遇到的一些问题1_下载2_配置环境变量2.1_配置JAVA_HOME2.2_配置CLASS_PATH2.2_配置系统路径PATH3_遇到的问题3.1_输入java -version无效3.2_javac无效1_下载 2_配置环境变量 打开我的电脑&#xff0c;右击空白处点击属性 点击高级系统设置 点击环境变量…

c fputc 函数重写_使用示例的C语言中的fputc()函数

c fputc 函数重写C中的fputc()函数 (fputc() function in C) Prototype: 原型&#xff1a; int fputc(const char ch, FILE *filename);Parameters: 参数&#xff1a; const char ch, FILE *filenameReturn type: int 返回类型&#xff1a; int Use of function: 使用功能&a…

信息系统状态过程图_操作系统中的增强型过程状态图

信息系统状态过程图The enhanced process state diagram was introduced for maintaining the degree of multiprogramming by the Operating System. The degree of multiprogramming is the maximum number of processes that can be handled by the main memory at a partic…

Java中竟有18种队列?45张图!安排

今天我们来盘点一下Java中的Queue家族&#xff0c;总共涉及到18种Queue。这篇恐怕是市面上最全最细讲解Queue的。本篇主要内容如下&#xff1a;本篇主要内容帮你总结好的阻塞队列&#xff1a;18种Queue总结一、Queue自我介绍 队列原理图1.1 Queue自我介绍hi&#xff0c;大家好&…

肯德尔相关性分析_肯德尔的Tau机器学习相关性

肯德尔相关性分析Before we begin I hope you guys have a basic understanding of Pearson’s and Spearmans correlation. As the name suggests this correlation was named after Maurice Kendall in the year 1938. 在开始之前&#xff0c;我希望你们对皮尔逊和斯皮尔曼的…

40 张图带你搞懂 TCP 和 UDP

我们本篇文章的组织脉络如下运输层位于应用层和网络层之间&#xff0c;是 OSI 分层体系中的第四层&#xff0c;同时也是网络体系结构的重要部分。运输层主要负责网络上的端到端通信。运输层为运行在不同主机上的应用程序之间的通信起着至关重要的作用。下面我们就来一起探讨一下…

腾讯推出高性能 RPC 开发框架

Tars是基于名字服务使用Tars协议的高性能RPC开发框架&#xff0c;同时配套一体化的服务治理平台&#xff0c;帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。Tars是将腾讯内部使用的微服务架构TAF&#xff08;Total Application Framework&#xff09;多年…

看完这篇文章,我再也不怕面试官问「垃圾回收」了...

前言 Java 相比 C/C 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收)&#xff0c;它解决了 C/C 最令人头疼的内存管理问题&#xff0c;让程序员专注于程序本身&#xff0c;不用关心内存回收这些恼人的问题&#xff0c;这也是 Java 能大行其道的重要原因之…