{"id":37418680,"url":"https://github.com/yutils/yhttp","last_synced_at":"2026-01-16T06:03:44.839Z","repository":{"id":52752318,"uuid":"283929729","full_name":"yutils/yhttp","owner":"yutils","description":"Http网络请求，使用简单，快速，支持java，kotlin，安卓，一行实现网络请求，支持https、session、get、post、put、delete、多文件上传、文件下载、日志完整显示等。","archived":false,"fork":false,"pushed_at":"2023-05-16T07:49:05.000Z","size":831,"stargazers_count":9,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2023-07-28T09:17:08.048Z","etag":null,"topics":["androidhttp","http","httpandroid","httpjava","javahttp","yhttp"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yutils.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-31T03:08:55.000Z","updated_at":"2023-07-23T11:14:32.000Z","dependencies_parsed_at":"2022-08-30T06:11:06.466Z","dependency_job_id":null,"html_url":"https://github.com/yutils/yhttp","commit_stats":null,"previous_names":[],"tags_count":13,"template":null,"template_full_name":null,"purl":"pkg:github/yutils/yhttp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yutils%2Fyhttp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yutils%2Fyhttp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yutils%2Fyhttp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yutils%2Fyhttp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yutils","download_url":"https://codeload.github.com/yutils/yhttp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yutils%2Fyhttp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477616,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T03:13:13.607Z","status":"ssl_error","status_checked_at":"2026-01-16T03:11:47.863Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["androidhttp","http","httpandroid","httpjava","javahttp","yhttp"],"created_at":"2026-01-16T06:03:44.759Z","updated_at":"2026-01-16T06:03:44.832Z","avatar_url":"https://github.com/yutils.png","language":"Java","readme":"# YHttp网络请求，原生JAVA实现，小巧快速\n## 支持原生java工程，原生kotlin工程，安卓工程。\n### 优点：\n\u003e * 1.支持get，post，put，delete请求，一行实现同步请求，一行实现异步请求\n\u003e * 2.post请求可为字符串，map，byte[]\n\u003e * 3.直接返回请求结果为 字符串 或 对象 或 byte[]\n\u003e * 4.支持各种格式文件下载，回调进度条\n\u003e * 5.单次文件上传请求中可以包含多种不同格式文件\n\u003e * 6.日志详细记录请求数据和结果，可关闭日志，异常请求回调异常原因\n\u003e * 7.支持https,支持设置ssl文件\n\u003e * 8.sessionID的获取和设置，可以切换多个不同sessionID\n\u003e * 9.简单好用,作者持续更新\n\u003e * 10.支持安卓，请求结果直接回调到UI线程（主线程）\n\u003e * 11.自定义gson，如：可以直接序列化指定日期格式的内容\n\u003e * 12.链式调用，代码更加简洁，可以不监听失败回调  \n\u003e * 13.返回数据在logcat中清晰可见，并且可以直接返回对象\n\n采用java17，安卓13.0，API33，androidx。\n\n# 建议大家使用OKHTTP\n\n## Gradle采用java17！！！ java17！！！java17！！！\n\n### 设置方法： Project Structure ----\u003e SDK Location ----\u003e JDK location was moved to Gradle Settings. ----\u003e  Gradle JDK ----\u003e  JDK17\n\n#### 返回数据调试清晰可见，超长json自动分段打印logcat\n![logcat](doc/logcat.png)\n\n[![platform](https://img.shields.io/badge/platform-Android-lightgrey.svg)](https://developer.android.google.cn/studio/index.html)\n![Gradle](https://img.shields.io/badge/Gradle-7.5.1-brightgreen.svg)\n[![last commit](https://img.shields.io/github/last-commit/yutils/yhttp.svg)](https://github.com/yutils/yhttp/commits/master)\n![repo size](https://img.shields.io/github/repo-size/yutils/yhttp.svg)\n![android studio](https://img.shields.io/badge/android%20studio-2021.3.1-green.svg)\n[![maven](https://img.shields.io/badge/maven-address-green.svg)](https://search.maven.org/artifact/com.kotlinx/yhttp)\n\n## 已经从jitpack.io仓库移动至maven中央仓库 \n\n**[releases里面有JAR包。点击前往](https://github.com/yutils/yhttp/releases)**\n\n## Gradle 引用\n\n[添加依赖，当前最新版：————\u003e 1.1.4　　　　![最新版](https://img.shields.io/badge/%E6%9C%80%E6%96%B0%E7%89%88-1.1.4-green.svg)](https://search.maven.org/artifact/com.kotlinx/yhttp)\n\n```\ndependencies {\n    //更新地址  https://github.com/yutils/yhttp 建议过几天访问看下有没有新版本\n    implementation 'com.kotlinx:yhttp:1.1.4'\n}\n```\n\n注：如果引用失败，看下面方案\n```\nallprojects {\n    repositories {\n        //google()\n        //mavenCentral()\n        \n        //阿里云镜像\n        maven { url 'https://maven.aliyun.com/repository/public' }\n        maven { url 'https://maven.aliyun.com/repository/google' }\n\n        //如果还是不容易拉取,可以试试直接用maven.org\n        maven { url 'https://repo1.maven.org/maven2' }\n    }\n```\n##  用法举例：\n  1.java工程中，异步请求，YHttp返回结果在子线程  \n  2.安卓工程中，异步请求，如果在UI线程（主线程）中创建YHttp，将返回结果返回到UI线程（主线程）  \n\n## 链式请求举例\n``` java\n//链式请求 java\nString url = \"http://192.168.6.9:8090/crash/user/login\";\nMap\u003cString, Object\u003e hashMap = new HashMap\u003cString, Object\u003e();// = hashMapOf(\"name\" to \"yujing\", \"password\" to \"wtugeqh\")\nhashMap.put(\"name\", \"yujing\");\nhashMap.put(\"password\", \"wtugeqh\");\nYHttp.create()\n        .url(url)\n        .post(hashMap)\n        .setSuccessListener((bytes, value) -\u003e {\n            System.out.println(\"请求成功：\" + value);\n        }).start();\n\n//链式,get\nYHttp\n.create()\n.url(\"http://192.168.6.9:8090/crash/\")\n.get()\n.setSuccessListener { bytes, value -\u003e textView1.text = \"成功：$value\" }\n.setFailListener { value -\u003e textView2.text = \"失败：$value\" }\n.start()\n\n//链式,post\nval url = \"http://192.168.6.9:8090/crash/user/login\"\nval gson=YJson.getGsonDate( \"yyyy年MM月dd日 HH:mm:ss\")\nval hashMap: HashMap\u003cString, Any\u003e = hashMapOf(\"name\" to \"yujing\", \"password\" to \"wtugeqh\")\nYHttp.create()\n    .url(url)\n    .post(hashMap)\n    .setGson(gson)\n    .setObjectListener(object : ObjectListener\u003cUser\u003e() {\n        override fun success(bytes: ByteArray?, value: User?) {\n            textView2.text = \"\\n对象：${value.toString()}\"\n        }\n    })\n    .setFailListener { value -\u003e textView2.text = \"失败：$value\" }\n    .start()\n\n//链式,自定义请求\nYHttp.create()\n    .url(url)\n    .method(\"POST\")\n    .setContentType(\"application/x-www-form-urlencoded;charset=utf-8\")\n    .addRequestProperty(\"connection\", \"Keep-Alive\")\n    .body(hashMap)\n    .setGson(gson)\n    .setSessionId(session)\n    .setCrtSSL(\"SSL证书内容\")\n    .setSuccessListener { bytes, value -\u003e textView1.text = \"成功：$value\" }\n    .setObjectListener(object : ObjectListener\u003cUser\u003e() {\n        override fun success(bytes: ByteArray?, value: User?) {\n            textView2.text = \"\\n对象：${value.toString()}\"\n        }\n    })\n    .setFailListener { value -\u003e textView2.text = \"失败：$value\" }\n    .setSessionListener { sessionId -\u003e session = sessionId }\n    .start()\n```\n\n## java举例\n``` java\nString url = \"http://www.xxx.xxx/xxx\";\n\n//同步请求get\nYHttpBase yHttp = new YHttpBase().setConnectTimeout(3000).setContentType(\"application/json; charset=utf-8\");\nString json = new String(yHttp.get(url), StandardCharsets.UTF_8);\n\n//同步请求post\nString json = new String(yHttp.post(url,\"id=123\u0026name=123\".getBytes()), StandardCharsets.UTF_8);\n\n//————————————————异步请求————————————————\n\n//定义地址\nString url=\"http://www.xxx.xxx/getUser\";\n//请求参数\nHashMap \u003cString,Object\u003e paramsMap=new HashMap\u003c\u003e();\nparamsMap.put(\"id\",\"123\");\n\n//异步请求,返回字符串，如是安卓项目返回值自动回到主线程，监听设置成YHttpListener就返回字符串，监听设置成YObjectListener就返回对象\nYHttp.create().post(url, paramsMap, new YHttpListener() {\n    @Override\n    public void success(byte[] bytes, String value) throws Exception {\n        //请求结果,文本\n    }\n    @Override\n    public void fail(String value) {\n        //错误原因\n    }\n});\n\n\n//异步请求,返回返回对象，如是安卓项目返回值自动回到主线程，监听设置成YHttpListener就返回字符串，监听设置成YObjectListener就返回对象\nYHttp.create().post(url, paramsMap, new YObjectListener\u003cUser\u003e() {\n    @Override\n    public void success(byte[] bytes, User value) {\n        //请求结果,对象\n    }\n    @Override\n    public void fail(String value) {\n        //错误原因\n    }\n});\n\n\n//java文件上传，如是安卓项目返回值自动回到主线程，监听设置成YHttpListener就返回字符串，监听设置成YObjectListener就返回对象\nString url = \"http://192.168.6.9:8090/crash/upload/file\";\nList\u003cUpload\u003e uploads = new ArrayList\u003c\u003e();\nuploads.add(new Upload(\"file1\", new File(\"D:/1.jpg\")));\nuploads.add(new Upload(\"file2\", \"ABCDEF\".getBytes()).setFilename(\"abcd.txt\"));\n\nYHttp.create().setSessionId(session).upload(url, \"\", uploads, new YHttpListener() {\n    @Override\n    public void success(byte[] bytes, String value){\n        System.out.println(\"上传成功：\" + value);\n    }\n    @Override\n    public void fail(String value) {\n        System.out.println(\"上传失败：\" + value);\n    }\n});\n\n\n//文件下载，如是安卓项目返回值自动回到主线程\nString url = \"https://down.qq.com/qqweb/PCQQ/PCQQ_EXE/PCQQ2020.exe\";\nFile f = new File( \"D:/QQ.exe\");\nYHttp.create().downloadFile(url, f, new YHttpDownloadFileListener (){\n    @Override\n    public void progress(int downloadSize, int fileSize) {\n        double progress = ((int)(10000.0 * downloadSize / fileSize))/100.0;//下载进度，保留2位小数\n    }\n    @Override\n    public void success(File file) {\n        //下载完成\n    }\n    @Override\n    public void fail(String value) {\n        //下载失败\n    }\n});\n```\n\n## kotlin举例\n``` kotlin\n\n//当前session值\nvar session = \"\"\n//请求地址\nval url = \"http://www.xxx.xxx/xxx\"\n//请求参数\nval hashMap: HashMap\u003cString, Any\u003e = hashMapOf(\"name\" to \"abc\", \"password\" to \"123456\")\n\n//post请求。保存sessionId，如登录，如是安卓项目返回值自动回到主线程，监听设置成YHttpListener就返回字符串，监听设置成YObjectListener就返回对象\nYHttp.create().setSessionListener { sessionId -\u003esession = sessionId }.post(url, hashMap, object : YHttpListener {\n    override fun success(bytes: ByteArray?, value: String?) {\n    //成功\n    }\n    override fun fail(value: String?) {\n    //失败\n    }\n})\n    \n\n//请求返回对象，带上sessionId，如业务操作，如是安卓项目返回值自动回到主线程，监听设置成YHttpListener就返回字符串，监听设置成YObjectListener就返回对象\nYHttp.create().setSessionId(session).post(url, map, object : YObjectListener\u003cUser\u003e() {\n     override fun success(bytes: ByteArray?, value: User?) {\n         runOnUiThread(Runnable {\n             YToast.show(App.get(), value?.Name)\n         })\n     }\n     override fun fail(value: String) {\n         runOnUiThread(Runnable {\n             YToast.show(App.get(), value)\n         })\n     }\n})\n\n\n//文件上传，并且上次参数请求，如是安卓项目返回值自动回到主线程，监听设置成YHttpListener就返回字符串，监听设置成YObjectListener就返回对象\nval url = \"http://192.168.6.9:8090/crash/upload/file\"\nval params: HashMap\u003cString, Any\u003e = hashMapOf(\"name\" to \"yujing\", \"password\" to \"123456\")\nval list: MutableList\u003cUpload\u003e = ArrayList()\nlist.add(Upload(\"file1\",file))\nlist.add(Upload(\"file2\", \"ABCDEF\".toByteArray()).setFilename(\"abcd.txt\"))\nlist.add(Upload(\"file3\",bitmap))\n//请求\nYHttp.create().setSessionId(session).upload(url, params, list, object : YHttpListener {\n    override fun success(bytes: ByteArray?, value: String?) {\n        //成功\n    }\n    override fun fail(value: String?) {\n        //失败\n    }\n})\n\n\n//文件下载，如是安卓项目返回值自动回到主线程\nval url = \"https://down.qq.com/qqweb/PCQQ/PCQQ_EXE/PCQQ2020.exe\"\n//保存路径\nvar f = File( \"D:/BB.exe\")\n//请求\nYHttp.create().downloadFile(url, f, object :\n    YHttpDownloadFileListener {\n    override fun progress(downloadSize: Int, fileSize: Int) {\n       val progress = (10000.0 * downloadSize / fileSize).toInt() / 100.0 //下载进度，保留2位小数\n    }\n    override fun success(file: File) {}//下载完成\n    override fun fail(value: String) {}//下载出错\n})\n```\n\n## 如安卓中使用注意添加权限：\n\u003e * 必须权限 　　　　　　　　——\u003e　　　　 android.permission.INTERNET\n\u003e * 返回对象必须引用Gson　　 ——\u003e　　　　 implementation 'com.google.code.gson:gson:2.8.6'\n\nGithub地址：[https://github.com/yutils/yhttp](https://github.com/yutils/yhttp)\n\n我的CSDN：[https://blog.csdn.net/Yu1441](https://blog.csdn.net/Yu1441)\n\n感谢关注微博：[细雨若静](https://weibo.com/32005200)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyutils%2Fyhttp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyutils%2Fyhttp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyutils%2Fyhttp/lists"}