Android 中基于 OKHttp 和 HttpUrlConnection 封装的 Http 请求库

Android 中基于 OKHttp 和 HttpUrlConnection 封装的 Http 请求库

1、项目地址

Github传送门

2、项目说明

HttpAgent 是 Android 网络请求框架,可以自定义网络引擎,支持 GET、POST、文件上传、文件下载,可以监听文件下载上传进度。本库内部基于 OkHttp 和 HttpUrlConnection 实现了两套网络请求逻辑,使用者可以根据自己的需要使用其中的某一种类型,或者自己按提供的接口自行实现。

3、使用说明

1、全局配置

HttpAgentClient.newBuilder()
            .setAgent(OkHttpEngine::class.java)
            .setConnectTimeOut(10000)
            .setReadTimeOut(10000)
            .build()

2、同步网络请求

val result = HttpRequest.newBuilder()
                .setUrl("http://www.example.com")
                .setMethod(HttpMethod.GET)
                .build()
                .executeSync<ResponseData>()
            Log.d("TAG", result.toString())

3、异步网络请求

HttpRequest.newBuilder()
            .setUrl("http://www.baidu.com")
            .setMethod(HttpMethod.GET)
            .build()
            .executeAsync(object : HttpCallBack<ResponseData> {
                override fun onReceivedData(result: ResponseData) {
                    Log.d("TAG", result.toString())
                }
            })

4、异步网络请求可以取消

var cancel = HttpRequest.newBuilder()
            .setUrl("http://www.example.com")
            .setMethod(HttpMethod.GET)
            .build()
            .executeAsync(object : HttpCallBack<ResponseData> {
                override fun onReceivedData(result: ResponseData) {
                    Log.d("TAG", result.toString())
                }
            })
cancel?.cancel()

5、上传文件,监听上传进度

var k = Environment.getExternalStorageDirectory().absolutePath.toString()
        val file = File("$k/DCIM/Camera/粘贴图片.png")
        HttpRequest.newBuilder()
            .setUrl("https://www.example.com")
            .setMethod(HttpMethod.POST)
            //.setBody(HttpBody(mapOf(Pair("keyword","苹果"))))
            //.setBody(HttpBody("{\"keyword\":\"苹果\"}"))
            .setBody(HttpBody(mapOf(Pair("hahha", "value")), mapOf(Pair("file111", file))))
            .build()
            .executeAsync(object : HttpCallBack<ResponseData> {
                override fun onReceivedData(result: ResponseData) {
                    Log.d("TAG", result.toString())
                }
            }) { current, total ->
                Log.d("HttpAgent", "current = $current,total = $total")
            }

6、下载文件,监听下载进度

var k = Environment.getExternalStorageDirectory().absolutePath.toString()
        val progressBar = showProgressDialog("下载进度")
        HttpRequest.newBuilder()
            .setUrl("https://www.wandoujia.com/apps/7965171/download/dot?ch=detail_normal_dl")
            .setMethod(HttpMethod.GET)
            .setSavePath(k,"王教授.apk")
            .build()
            .executeAsync(object :
                HttpCallBack<ResponseData> {
                override fun onReceivedData(result: ResponseData) {
                    Log.d("TAG", result.toString())
                    if(result.code == HttpURLConnection.HTTP_OK){
                        Toast.makeText(this@MainActivity,"下载成功",Toast.LENGTH_LONG).show()
                    }
                }
            }) { current, total ->
                Log.d("HttpAgent", "current = $current,total = $total")
                val current = (current.toInt()/total.toDouble())*100
                progressBar.setProgress(current.toInt(),true)
            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
封装一个包含 Header、Cookie 和 Data 的 Post 请求,你可以使用 Android 系统自带的 HttpURLConnection 类或者第三方 OkHttp。 以下是使用 HttpURLConnection 封装 Post 请求的示例代码: ```java public static String post(String urlString, String data, Map<String, String> headers, String cookie) throws IOException { URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setDoOutput(true); conn.setDoInput(true); // 设置 Header if (headers != null && !headers.isEmpty()) { for (Map.Entry<String, String> entry : headers.entrySet()) { conn.setRequestProperty(entry.getKey(), entry.getValue()); } } // 设置 Cookie if (cookie != null && !cookie.isEmpty()) { conn.setRequestProperty("Cookie", cookie); } // 写入请求数据 OutputStream os = conn.getOutputStream(); os.write(data.getBytes()); os.flush(); os.close(); // 读取响应数据 InputStream is = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); is.close(); conn.disconnect(); return response.toString(); } ``` 使用该方法时,需要传入以下参数: - urlString:请求的 URL 地址; - data:请求的数据,可以是 JSON 字符串等; - headers:请求的 Header,可以为空; - cookie:请求的 Cookie,可以为空。 示例代码使用了字节流和字符流进行数据的写入和读取,可以根据实际情况选择使用哪种方式。 如果你使用 OkHttp 来进行网络请求,也可以类似的方式设置 Header、Cookie 和请求数据。以下是使用 OkHttp 封装 Post 请求的示例代码: ```java public static String post(String urlString, String data, Map<String, String> headers, String cookie) throws IOException { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .build(); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), data); Request.Builder builder = new Request.Builder() .url(urlString) .post(requestBody); // 设置 Header if (headers != null && !headers.isEmpty()) { for (Map.Entry<String, String> entry : headers.entrySet()) { builder.addHeader(entry.getKey(), entry.getValue()); } } // 设置 Cookie if (cookie != null && !cookie.isEmpty()) { builder.addHeader("Cookie", cookie); } Request request = builder.build(); Response response = client.newCall(request).execute(); String result = response.body().string(); response.close(); return result; } ``` 使用该方法时,需要传入以下参数: - urlString:请求的 URL 地址; - data:请求的数据,可以是 JSON 字符串等; - headers:请求的 Header,可以为空; - cookie:请求的 Cookie,可以为空。 示例代码使用了 OkHttp 的 RequestBody 和 Request.Builder 类来设置请求数据和 Header,也可以根据实际情况选择使用其他方式设置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值