{"id":13537502,"url":"https://github.com/hongyangAndroid/okhttputils","last_synced_at":"2025-04-02T04:30:57.539Z","repository":{"id":43943491,"uuid":"40903276","full_name":"hongyangAndroid/okhttputils","owner":"hongyangAndroid","description":"[停止维护]okhttp的辅助类","archived":false,"fork":false,"pushed_at":"2022-10-12T06:21:59.000Z","size":17152,"stargazers_count":6870,"open_issues_count":217,"forks_count":2384,"subscribers_count":415,"default_branch":"master","last_synced_at":"2025-03-27T19:07:02.412Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://blog.csdn.net/lmj623565791/article/details/47911083","language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hongyangAndroid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-08-17T14:53:29.000Z","updated_at":"2025-03-18T06:44:14.000Z","dependencies_parsed_at":"2023-01-19T21:45:20.986Z","dependency_job_id":null,"html_url":"https://github.com/hongyangAndroid/okhttputils","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongyangAndroid%2Fokhttputils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongyangAndroid%2Fokhttputils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongyangAndroid%2Fokhttputils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongyangAndroid%2Fokhttputils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hongyangAndroid","download_url":"https://codeload.github.com/hongyangAndroid/okhttputils/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246757004,"owners_count":20828808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-08-01T09:00:59.744Z","updated_at":"2025-04-02T04:30:52.529Z","avatar_url":"https://github.com/hongyangAndroid.png","language":"Java","funding_links":[],"categories":["Java","网络编程"],"sub_categories":["Spring Cloud框架"],"readme":"# okhttp-utils\n\n\u003e由于个人原因，现已停止维护。\n\n对okhttp的封装类，okhttp见：[https://github.com/square/okhttp](https://github.com/square/okhttp).\n\n目前对应okhttp版本`3.3.1`.\n\n## 用法\n\n* Android Studio\n\t\n\t```\n\tcompile 'com.zhy:okhttputils:2.6.2'\n\t```\n\t\n* Eclipse\n\t\n\t下载最新jar:[okhttputils-2\\_6\\_2.jar](okhttputils-2_6_2.jar?raw=true)\n\n\t注：需要同时导入okhttp和okio的jar，下载见：[https://github.com/square/okhttp](https://github.com/square/okhttp).\n\t\n\n## 目前对以下需求进行了封装\n* 一般的get请求\n* 一般的post请求\n* 基于Http Post的文件上传（类似表单）\n* 文件下载/加载图片\n* 上传下载的进度回调\n* 支持取消某个请求\n* 支持自定义Callback\n* 支持HEAD、DELETE、PATCH、PUT\n* 支持session的保持\n* 支持自签名网站https的访问，提供方法设置下证书就行\n\n## 配置OkhttpClient\n\n默认情况下，将直接使用okhttp默认的配置生成OkhttpClient，如果你有任何配置，记得在Application中调用`initClient`方法进行设置。\n\n```java\npublic class MyApplication extends Application\n{\t\n\t@Override\n    public void onCreate()\n    {\n        super.onCreate();\n\n        OkHttpClient okHttpClient = new OkHttpClient.Builder()\n//                .addInterceptor(new LoggerInterceptor(\"TAG\"))\n                  .connectTimeout(10000L, TimeUnit.MILLISECONDS)\n                  .readTimeout(10000L, TimeUnit.MILLISECONDS)\n                  //其他配置\n                 .build();\n                 \n        OkHttpUtils.initClient(okHttpClient);\n\n    }\n}\n```\n别忘了在AndroidManifest中设置。\n\n## 对于Cookie(包含Session)\n\n对于cookie一样，直接通过cookiejar方法配置，参考上面的配置过程。\n\n```\nCookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));\nOkHttpClient okHttpClient = new OkHttpClient.Builder()\n          .cookieJar(cookieJar)\n          //其他配置\n         .build();\n                 \nOkHttpUtils.initClient(okHttpClient);\n```\n目前项目中包含：\n\n* PersistentCookieStore //持久化cookie\n* SerializableHttpCookie //持久化cookie\n* MemoryCookieStore //cookie信息存在内存中\n\n如果遇到问题，欢迎反馈，当然也可以自己实现CookieJar接口，编写cookie管理相关代码。\n\n此外，对于持久化cookie还可以使用[https://github.com/franmontiel/PersistentCookieJar](https://github.com/franmontiel/PersistentCookieJar).\n\n相当于框架中只是提供了几个实现类，你可以自行定制或者选择使用。\n\n## 对于Log\n\n初始化OkhttpClient时，通过设置拦截器实现，框架中提供了一个`LoggerInterceptor `，当然你可以自行实现一个Interceptor 。\n\n```\n OkHttpClient okHttpClient = new OkHttpClient.Builder()\n       .addInterceptor(new LoggerInterceptor(\"TAG\"))\n        //其他配置\n        .build();\nOkHttpUtils.initClient(okHttpClient);\n```\n\n\n## 对于Https\n\n依然是通过配置即可，框架中提供了一个类`HttpsUtils`\n\n* 设置可访问所有的https网站\n\n```\nHttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);\nOkHttpClient okHttpClient = new OkHttpClient.Builder()\n        .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)\n         //其他配置\n         .build();\nOkHttpUtils.initClient(okHttpClient);\n```\n\n* 设置具体的证书\n\n```\nHttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(证书的inputstream, null, null);\nOkHttpClient okHttpClient = new OkHttpClient.Builder()\n        .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager))\n         //其他配置\n         .build();\nOkHttpUtils.initClient(okHttpClient);\n```\n\n* 双向认证\n\n```\nHttpsUtils.getSslSocketFactory(\n\t证书的inputstream, \n\t本地证书的inputstream, \n\t本地证书的密码)\n```\n\n同样的，框架中只是提供了几个实现类，你可以自行实现`SSLSocketFactory`，传入sslSocketFactory即可。\n\n##其他用法示例\n\n### GET请求\n\n```java\nString url = \"http://www.csdn.net/\";\nOkHttpUtils\n    .get()\n    .url(url)\n    .addParams(\"username\", \"hyman\")\n    .addParams(\"password\", \"123\")\n    .build()\n    .execute(new StringCallback()\n\t        {\n\t            @Override\n\t            public void onError(Request request, Exception e)\n\t            {\n\t                \n\t            }\n\t\n\t            @Override\n\t            public void onResponse(String response)\n\t            {\n\t\n\t            }\n\t        });\n```\n\n### POST请求\n\n```java\n OkHttpUtils\n    .post()\n    .url(url)\n    .addParams(\"username\", \"hyman\")\n    .addParams(\"password\", \"123\")\n    .build()\n    .execute(callback);\n\n```\n\n### Post JSON\n\n```java\n  OkHttpUtils\n    .postString()\n    .url(url)\n    .content(new Gson().toJson(new User(\"zhy\", \"123\")))\n     .mediaType(MediaType.parse(\"application/json; charset=utf-8\"))\n    .build()\n    .execute(new MyStringCallback());\n```\n\n提交一个Gson字符串到服务器端，注意：传递JSON的时候，不要通过addHeader去设置contentType，而使用`.mediaType(MediaType.parse(\"application/json; charset=utf-8\"))`.。\n\n### Post File\n\n```java\n OkHttpUtils\n\t.postFile()\n\t.url(url)\n\t.file(file)\n\t.build()\n\t.execute(new MyStringCallback());\n```\n将文件作为请求体，发送到服务器。\n\n\n### Post表单形式上传文件\n\n```java\nOkHttpUtils.post()//\n    .addFile(\"mFile\", \"messenger_01.png\", file)//\n    .addFile(\"mFile\", \"test1.txt\", file2)//\n    .url(url)\n    .params(params)//\n    .headers(headers)//\n    .build()//\n    .execute(new MyStringCallback());\n```\n\n支持单个多个文件，`addFile`的第一个参数为文件的key，即类别表单中`\u003cinput type=\"file\" name=\"mFile\"/\u003e`的name属性。\n\n### 自定义CallBack\n\n目前内部包含`StringCallBack`,`FileCallBack`,`BitmapCallback`，可以根据自己的需求去自定义Callback，例如希望回调User对象：\n\n```java\npublic abstract class UserCallback extends Callback\u003cUser\u003e\n{\n    @Override\n    public User parseNetworkResponse(Response response) throws IOException\n    {\n        String string = response.body().string();\n        User user = new Gson().fromJson(string, User.class);\n        return user;\n    }\n}\n\n OkHttpUtils\n    .get()//\n    .url(url)//\n    .addParams(\"username\", \"hyman\")//\n    .addParams(\"password\", \"123\")//\n    .build()//\n    .execute(new UserCallback()\n    {\n        @Override\n        public void onError(Request request, Exception e)\n        {\n            mTv.setText(\"onError:\" + e.getMessage());\n        }\n\n        @Override\n        public void onResponse(User response)\n        {\n            mTv.setText(\"onResponse:\" + response.username);\n        }\n    });\n\n```\n\n通过`parseNetworkResponse `回调的response进行解析，该方法运行在子线程，所以可以进行任何耗时操作，详细参见sample。\n\n\n### 下载文件\n\n```java\n OkHttpUtils//\n\t.get()//\n\t.url(url)//\n\t.build()//\n\t.execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), \"gson-2.2.1.jar\")//\n\t{\n\t    @Override\n\t    public void inProgress(float progress)\n\t    {\n\t        mProgressBar.setProgress((int) (100 * progress));\n\t    }\n\t\n\t    @Override\n\t    public void onError(Request request, Exception e)\n\t    {\n\t        Log.e(TAG, \"onError :\" + e.getMessage());\n\t    }\n\t\n\t    @Override\n\t    public void onResponse(File file)\n\t    {\n\t        Log.e(TAG, \"onResponse :\" + file.getAbsolutePath());\n\t    }\n\t});\n```\n\n注意下载文件可以使用`FileCallback`，需要传入文件需要保存的文件夹以及文件名。\n\n\n### 显示图片\n\n```java\n OkHttpUtils\n    .get()//\n    .url(url)//\n    .build()//\n    .execute(new BitmapCallback()\n    {\n        @Override\n        public void onError(Request request, Exception e)\n        {\n            mTv.setText(\"onError:\" + e.getMessage());\n        }\n\n        @Override\n        public void onResponse(Bitmap bitmap)\n        {\n            mImageView.setImageBitmap(bitmap);\n        }\n    });\n```\n\n显示图片，回调传入`BitmapCallback`即可。\n\n\n### 上传下载的进度显示\n\n```java\nnew Callback\u003cT\u003e()\n{\n    //...\n    @Override\n    public void inProgress(float progress)\n    {\n       //use progress: 0 ~ 1\n    }\n}\n```\n\ncallback回调中有`inProgress `方法，直接复写即可。\n\n### HEAD、DELETE、PUT、PATCH\n\n```java\n\nOkHttpUtils\n     .put()//also can use delete() ,head() , patch()\n     .requestBody(RequestBody.create(null, \"may be something\"))//\n     .build()//\n     .execute(new MyStringCallback());\n```\n\n如果需要requestBody，例如：PUT、PATCH，自行构造进行传入。\n\n\n\n### 同步的请求\n\n```\n Response response = OkHttpUtils\n    .get()//\n    .url(url)//\n    .tag(this)//\n    .build()//\n    .execute();\n```\n\nexecute方法不传入callback即为同步的请求，返回Response。\n\n\n### 取消单个请求\n\n```java\n RequestCall call = OkHttpUtils.get().url(url).build();\n call.cancel();\n \n```\n\n### 根据tag取消请求\n\n目前对于支持的方法都添加了最后一个参数`Object tag`，取消则通过` OkHttpUtils.cancelTag(tag)`执行。\n\n例如：在Activity中，当Activity销毁取消请求：\n\n```\nOkHttpUtils\n    .get()//\n    .url(url)//\n    .tag(this)//\n    .build()//\n\n@Override\nprotected void onDestroy()\n{\n    super.onDestroy();\n    //可以取消同一个tag的\n    OkHttpUtils.cancelTag(this);//取消以Activity.this作为tag的请求\n}\n```\n比如，当前Activity页面所有的请求以Activity对象作为tag，可以在onDestory里面统一取消。\n\n## 混淆\n\n```\n#okhttputils\n-dontwarn com.zhy.http.**\n-keep class com.zhy.http.**{*;}\n\n\n#okhttp\n-dontwarn okhttp3.**\n-keep class okhttp3.**{*;}\n\n\n#okio\n-dontwarn okio.**\n-keep class okio.**{*;}\n\n\n```\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FhongyangAndroid%2Fokhttputils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FhongyangAndroid%2Fokhttputils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FhongyangAndroid%2Fokhttputils/lists"}