使用HttpURLConnection代替HttpClient

使用HttpURLConnection代替HttpClient

在Android的新版本中,apache包中的HttpClient由于安全性等某些原因被删除,甚至整个org.apache都不再包含在Android的API中。这导致了许多原本使用HttpClient来链接Android前端后台的朋友出现了许多困扰。
现在我们有两种方法解决问题:
方法一:
比较快速,但不是根本解决之道)在Gradle Scripts目录下的build.gradle(Module:app)内的android{}代码块中添加一句:useLibrary ‘org.apache.http.legacy’,如图:
这里写图片描述
方法二:
比较慢,但是根本解决之道)Android官方文档给出的建议是:Please use openConnection() instead.就是使用 openConnection()方法来替代。
查看openConnection(),注意到它返回一个URLConnection类型的抽象类对象。针对http的链接问题,我们可以直接使用它的“Direct Subclass”——直接子类,HttpURLConnection
要点:
1.当发送请求上传数据时,必须配置 setDoOutput(true),通过 getOutputStream() 方法返回的流来传递上传数据;为了更好的性能表现,在已知上传数据大小的情况下调用 setFixedLengthStreamingMode(long contentLength),在不知道大小的情况下,调用setChunkedStreamingMode(int chunkLength),其中chunkLength是你的上传数据要分成的块的大小,太大则会造成内存占用风险,太小就是生成过多的标志信息,一般情况下写0,即采用默认的块大小;
2.当读取返回内容时,通过 getInputStream() 方法来读取返回的流;
3.当关闭连接时,调用 disconnect() 来释放资源;
4.HttpURLConnection 最多将允许5次重定向,但不允许从https到http的重定向。如果返回表明有问题,getInputStream()将会抛出IOException异常,使用 getErrorStream()来读取错误内容;
5.由于返回的输入输出流是没有缓存的,大多数的调用需要包裹在 BufferedInputStream 或 BufferedOutputStream 中,或使用 BufferedReader 或 BufferedWriter;
6.注意在Manifest中声明权限:<uses-permission android:name="android.permission.INTERNET" />

例子:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

/**
 * Created by Founder on 2016/4/4.
 * Author:FounderWatts
 */
public class MyConnection {

    /*
    * urlStr:网址
    * parms:提交数据
    * return:网页源码
    * */
    public String getContextByHttp(String urlStr,Map<String,String> parms){
        StringBuilder sb = new StringBuilder();
        try{
            URL url = new URL(urlStr);
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("POST");
            connection.setReadTimeout(5000);
            connection.setConnectTimeout(5000);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setInstanceFollowRedirects(true);

            OutputStream outputStream = connection.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
            writer.write(getStringFromOutput(parms));

            writer.flush();
            writer.close();
            outputStream.close();

            if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String temp;
                while((temp = reader.readLine()) != null){
                    sb.append(temp);
                }
                reader.close();
            }else{
                return "connection error:" + connection.getResponseCode();
            }

            connection.disconnect();
        }catch (Exception e){
            return e.toString();
        }
        return sb.toString();
    }

    private String getStringFromOutput(Map<String,String> map) throws UnsupportedEncodingException {
        StringBuilder sb = new StringBuilder();
        boolean isFirst = true;

        for(Map.Entry<String,String> entirty:map.entrySet()){
            if(isFirst)
                isFirst = false;
            else
                sb.append("&");

            sb.append(URLEncoder.encode(entirty.getKey(),"UTF-8"));
            sb.append("=");
            sb.append(URLEncoder.encode(entirty.getValue(),"UTF-8"));
        }
        return sb.toString();
    }
}



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值