OkHttp和HttpUrlConnection的示例

okhttp

//okhttp 使用
    private void textOkHttp() {
        //缓存
        Cache cache = new Cache(getExternalCacheDir(), 1024 * 1024);
        //拦截器
        Interceptor interceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                //拦截 请求和响应
                Request request = chain.request();
                //进行 请求并获取 响应
                Response response = chain.proceed(request);
                return response;
            }
        };
        //OkHttp会自动重试未验证的请求。
        // 当响应是401 Not Authorized时,Authenticator会被要求提供证书。
        // Authenticator的实现中需要建立一个新的包含证书的请求。
        // 如果没有证书可用,返回null来跳过尝试。
        okhttp3.Authenticator authenticator = new okhttp3.Authenticator() {

            @Override
            public Request authenticate(Route route, Response response)
                    throws IOException {
                String credential = Credentials.basic("用户名", "密码");
                return response.request().newBuilder()
                        .header("Authorization", credential)
                        .build();
            }
        };
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(30000, TimeUnit.MILLISECONDS)
                .cache(cache)
                .addInterceptor(interceptor)
                .authenticator(authenticator)
                .build();

        //get请求
        Request request = new Request.Builder()
                .url("接口")
                .addHeader("", "")
                .build();
        try {
            //同步请求
            Response response = okHttpClient.newCall(request).execute();
            response.body().toString();
            //异步请求
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response)
                        throws IOException {

                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        //post请求
//        RequestBody的数据格式都要指定Content-Type,常见的有三种:
//        application/x-www-form-urlencoded 数据是个普通表单
//        multipart/form-data 数据里有文件
//        application/json 数据是个json
        MediaType.parse("application/x-www-form-urlencoded");
        MediaType.parse("multipart/form-data");
        MediaType.parse("application/json");
        //如果数据是表单
        RequestBody body = new FormBody.Builder()
                .add("键", "值")
                .add("键", "值")
                .build();
        //如果数据是个json
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody body1 = RequestBody.create(JSON, "你的json");
        //如果数据包含文件
        RequestBody body2 = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file", file.getName(),
                        RequestBody.create(MediaType.parse("image/png"), file))
                .build();
        Request request1 = new Request.Builder()
                .url("")
                .post(body)
                .build();
        try {
            //同步 请求
            okHttpClient.newCall(request).execute();
            //异步 请求
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response)
                        throws IOException {
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

httpUrlConnection

//httpurlconnection使用
    //outputStr参数
    private void textHttpUrl(String path, String outputStr) {
        try {
            URL url = new URL(path);
            HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
            httpUrlConn.setDoInput(true);
            httpUrlConn.setDoOutput(true);
            httpUrlConn.setUseCaches(false);
            httpUrlConn.setRequestMethod("get");
            //建立连接,判断状态码
            httpUrlConn.connect();
            if (httpUrlConn.getResponseCode() == 200) {
                // 有数据需要提交
                toRequest(httpUrlConn.getOutputStream(), outputStr);
                //收到返回 的数据
                String responseData = getResponse(httpUrlConn.getInputStream());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void toRequest(OutputStream outputStream, String outputStr) {
        if (null != outputStr) {
            // 注意编码格式,防止中文乱码
            try {
                outputStream.write(outputStr.getBytes("UTF-8"));
                // 释放资源
                outputStream.close();
                outputStream = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private String getResponse(InputStream inputStream) {
        // 将返回的输入流转换成字符串
        InputStreamReader inputStreamReader = null;
        StringBuffer buffer = new StringBuffer();
        try {
            inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            // 释放资源
            inputStream.close();
            inputStream = null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer.toString();
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值