{"id":22935158,"url":"https://github.com/jymot/mhttp","last_synced_at":"2025-08-24T03:32:55.156Z","repository":{"id":138862652,"uuid":"46416132","full_name":"jymot/MHttp","owner":"jymot","description":"okhttp wrapper for Android Http.","archived":false,"fork":false,"pushed_at":"2020-02-25T15:33:49.000Z","size":424,"stargazers_count":79,"open_issues_count":2,"forks_count":12,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-07-08T06:08:59.965Z","etag":null,"topics":["android","http","okhttp-wrapper"],"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/jymot.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,"governance":null}},"created_at":"2015-11-18T12:04:01.000Z","updated_at":"2025-06-12T02:21:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"c59f3253-3273-48dc-a1cd-ade717887ca2","html_url":"https://github.com/jymot/MHttp","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/jymot/MHttp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMHttp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMHttp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMHttp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMHttp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jymot","download_url":"https://codeload.github.com/jymot/MHttp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMHttp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271785867,"owners_count":24820559,"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","status":"online","status_checked_at":"2025-08-24T02:00:11.135Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["android","http","okhttp-wrapper"],"created_at":"2024-12-14T11:46:41.575Z","updated_at":"2025-08-24T03:32:55.124Z","avatar_url":"https://github.com/jymot.png","language":"Java","readme":"# MHttp\nokhttp wrapper for Android Http.\n### Gradle:\n```gradle\n  compile 'im.wangchao:mhttp:1.10.1'\n  annotationProcessor 'im.wangchao:mhttp-compiler:0.5.2'\n```\nyou can use `implementation` replace of `compile`.\n\nIf you use RxJava\n```gradle\n  compile 'io.reactivex.rxjava2:rxjava:2.x.y'\n```\n\n### PROGUARD\nProGuard rules now ship inside of the library and are included automatically.\n```java\n    -keep class im.wangchao.** { *; }\n    -dontwarn im.wangchao.**\n    -keep class **_HttpBinder { *; }\n    -keepclasseswithmembernames class * {\n        @im.wangchao.* \u003cfields\u003e;\n    }\n    -keepclasseswithmembernames class * {\n        @im.wangchao.* \u003cmethods\u003e;\n    }\n    -keepclassmembers class * implements java.io.Serializable {  \n        static final long serialVersionUID;  \n        private static final java.io.ObjectStreamField[] serialPersistentFields;  \n        !static !transient \u003cfields\u003e;  \n        private void writeObject(java.io.ObjectOutputStream);  \n        private void readObject(java.io.ObjectInputStream);  \n        java.lang.Object writeReplace();  \n        java.lang.Object readResolve();  \n    }\n    # If you do not use Rx:\n    -dontwarn rx.**\n```\n### How to use\n#### 1.Normal Get\n```java\n     Request.builder().url(\"https://www.baidu.com\")\n                    .callback(new TextCallbackHandler(){\n                        @Override public void onSuccess(String data, Response response) {\n                            Log.e(MainActivity.TAG, data);\n                        }\n                    })\n                    .build()\n                    .enqueue();\n```\n#### 2.Normal Post\n```java\n    Request.builder().url(\"url\")\n                    .addHeader(\"key\", \"value\")\n                    .addParameter(\"key\", \"value\")\n                    .callback(new JSONCallbackHandler(){\n                        @Override public void onSuccess(JSON data, Response response) {\n                            //TODO\n                        }\n                    })\n                    .build()\n                    .enqueue();\n```\n#### 3.Annotation (Support Post and Get)\nTurns your HTTP API into a Java interface or abstract Class.\n```java\n    public interface GetBaidu{\n            @Get(url = \"https://www.baidu.com\")\n           void baidu(@Callback TextCallbackHandler callback);\n    }\n\n    public interface PostApi{\n\n           @Post(url = \"http://www.baidu.com\")\n           Request postRequest(String param0, String param1, @Callback TextCallbackHandler callback);\n\n           @Post(url = \"http://www.baidu.com\")\n           void autoExecuteRequest(String param0, String param1, @Callback TextCallbackHandler callback);\n    }\n```\n\nThe MHttp class generates an implementation of this interface(abstract).\n```java\n    GetBaidu api = MHttp.create(GetBaidu.class);\n    api.baidu(new TextCallbackHandler(){\n              @Override protected void onSuccess(String data, OkResponse response) {\n                  Log.e(MainActivity.TAG, data);\n              }\n    });\n\n    //auto send\n    PostApi api = MHttp.create(PostApi.class);\n    api.autoExecuteRequest(\"aa\", \"bb\", new TextCallbackHandler(){\n             @Override protected void onSuccess(String data, OkResponse response) {\n                 //Todo\n             }\n    );\n\n    //obtain request\n    PostApi api = MHttp.create(PostApi.class);\n    Request request =  api.postRequest(\"aa\", \"bb\", new TextCallbackHandler(){\n             @Override protected void onSuccess(String data, OkResponse response) {\n                 //Todo\n             }\n    });\n    request.enqueue();\n```\n\nAutomatically generated classes when you use the Annotation.\n```java\n\n/**\n * Implementation GetBaidu interface\n */\npublic class GetExample$GetBaidu$$HttpBinder implements GetBaidu {\n    public GetExample$GetBaidu$$HttpBinder() {\n    }\n\n    public void baidu(TextCallbackHandler callback) {\n        RequestParams params = new RequestParams();\n        Builder builder = new Builder();\n        builder.requestParams(params);\n        builder.url(\"https://www.baidu.com\");\n        MHttp.instance().timeout(30);\n        okhttp3.Headers.Builder headerBuilder = new okhttp3.Headers.Builder();\n        builder.headers(headerBuilder.build());\n        builder.method(\"GET\");\n        builder.callback(callback);\n        builder.build().enqueue();\n    }\n}\n\n/**\n * Implementation PostApi interface\n */\npublic class PostExample$PostApi$$HttpBinder implements PostApi {\n    public PostExample$PostApi$$HttpBinder() {\n    }\n\n    public Request postRequest(String param0, String param1, TextCallbackHandler callback) {\n        String FIELD_PARAM0 = \"param0\";\n        String FIELD_PARAM1 = \"param1\";\n        RequestParams params = new RequestParams();\n        params.put(\"param0\", param0);\n        params.put(\"param1\", param1);\n        Builder builder = new Builder();\n        builder.requestParams(params);\n        builder.url(\"http://www.baidu.com\");\n        MHttp.instance().timeout(30);\n        okhttp3.Headers.Builder headerBuilder = new okhttp3.Headers.Builder();\n        builder.headers(headerBuilder.build());\n        builder.method(\"POST\");\n        builder.callback(callback);\n        return builder.build();\n    }\n\n    public void autoExecuteRequest(String param0, String param1, TextCallbackHandler callback) {\n        String FIELD_PARAM0 = \"param0\";\n        String FIELD_PARAM1 = \"param1\";\n        RequestParams params = new RequestParams();\n        params.put(\"param0\", param0);\n        params.put(\"param1\", param1);\n        Builder builder = new Builder();\n        builder.requestParams(params);\n        builder.url(\"http://www.baidu.com\");\n        MHttp.instance().timeout(30);\n        okhttp3.Headers.Builder headerBuilder = new okhttp3.Headers.Builder();\n        builder.headers(headerBuilder.build());\n        builder.method(\"POST\");\n        builder.callback(callback);\n        builder.build().enqueue();\n    }\n}\n```\n\nIf you want to set default configuration. You can create a Java abstract Class.\n```java\npublic abstract class SampleDefaultApi {\n\n    @RootURL(\"https://www.baidu.com/\") String baseURL;\n    @Timeout(40) String timeout;\n    @RequestContentType(RequestParams.APPLICATION_JSON) String Content_Type;\n    @Header(\"Android\") String User_Agent;\n\n    @CommonParamsMethod public Map\u003cString, String\u003e getCommonParams() {\n        Map\u003cString, String\u003e params = new HashMap\u003c\u003e();\n        // TODO\n        return params;\n    }\n\n}\n```\nAnd you can turns your HTTP API into a Java abstract Class, and extend this abstract Class.\nExample below:\n```java\npublic abstract class SampleApi extends SampleDefaultApi{\n    public static SampleApi instance() {\n        return MHttp.create(SampleApi.class);\n    }\n\n    @Get(url = \"https://www.baidu.com/\")\n    public abstract void baidu(@Callback TextCallbackHandler callback);\n\n    @Get(url = \"s\", tag = \"aaa\")\n    public abstract Request search(String wd, @Callback TextCallbackHandler callback);\n\n    @Get(url = \"s\", tag = \"aaa\")\n    public abstract Request search1(String wd, @Callback TextCallbackHandler callback, @Tag Object a);\n}\n\n```\n#### 4.Callback\nSeveral common methods are provided. as follows:\n```\nJSONCallbackHandler\nTextCallbackHandler\nBinaryCallbackHandler\nBitmapCallbackHandler\nFileCallbackHandler\nGSONCallbackHandler\n```\nIf you want to customize the Callback Method, you can inherit AbsCallbackHandler like the method above.\n\n#### 5.ThreadMode\n * SENDING -- Callback will be called in the same thread, which is sending the request.\n * MAIN -- Callback will be called in Android's main thread (UI thread).\n * BACKGROUND -- Callback will be called in a background thread. That is, work on the request thread(okhttp thread).\n\nNow you can make your own thread. Only need to implement java.util.concurrent.Executor, and set it to your request.\n\n#### 6.Custom okHttpClient\n```java\nCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(this));\nOkHttpClient okHttpClient = new OkHttpClient.Builder()\n        .cookieJar(cookieJar)\n        .build();\nMHttp.instance()\n        .customOkHttpClient(okHttpClient) // custom client\n        .cache(/*context*/, /*cache dir*/)\n        .setURLInterceptor(new URLInterceptor() {\n            @Override public String interceptor(String origin) {\n                // handle url\n                return origin;\n            }\n\n            @Override public HttpUrl interceptor(HttpUrl origin) {\n                return origin;\n            }\n\n            @Override public URL interceptor(URL origin) {\n                return origin;\n            }\n        });\n```\nPlease set before calling the request.\n\n#### 7.RxRequest\n```java\nDisposable disposable = RxRequest.\u003cString\u003ebuilder()\n        .get()\n        .url(\"https://www.baidu.com\")\n        .callback(new TextCallbackHandler(){\n            @Override public void onStart() {\n                Log.e(\"wcwcwc\", \"onStart\");\n            }\n\n            @Override public void onFinish() {\n                Log.e(\"wcwcwc\", \"onFinish\");\n            }\n\n            @Override public void onCancel() {\n                Log.e(\"wcwcwc\", \"onCancel\");\n            }\n        }).build()\n        .enqueue()\n        .observeOn(Schedulers.io())\n        .doOnDispose(()-\u003e{\n            Log.e(\"wcwcwc\", \"cancel\");\n        })\n        .subscribe(result -\u003e {\n            Log.e(\"wcwcwc\", Thread.currentThread().getName() + \" result: \" + result);\n        }, throwable -\u003e {\n            Log.e(\"wcwcwc\", Thread.currentThread().getName() + \" throwable: \" + throwable.getMessage());\n        });\n\n...\n// dispose\ndisposable.dispose();\n```\n\n### Contact Me\n- Email:  magician.of.technique@aliyun.com\n\n### TODO\n- optmize annotation\n\n### License\n\n    Copyright 2018 Mot. All rights reserved.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjymot%2Fmhttp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjymot%2Fmhttp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjymot%2Fmhttp/lists"}