HttpURLConnection

来源:互联网 发布:qq有linux版本吗 编辑:程序博客网 时间:2024/06/10 19:29

Http学习之使用HttpURLConnection发送post和get请求

HttpURLConnection用法详解

使用HttpURLConnection发送post和get请求

android httpUrlConnection 设置cookies

HttpURLConnection实现断点下载

Http学习之使用HttpURLConnection发送post和get请求 异步

HttpURLConnection请求时使用CookieHandler,CookieManager和CookieStore获取Cookie

上传

传图片

HttpURLConnection与 CookieManager 实现Post提交请求和Cookie管理


注:应用HttpURLConnection有个大Bug,无法解决,就是报以下错k误时是没办法解决的,平时用都没问题,哪天报这种Bug时就玩完。

java.net.ProtocolException: Connection already established


本人的源码如下:

package utility;import android.content.Context;import android.graphics.BitmapFactory;import android.os.Handler;import com.heiyouhui.m.Flag;import org.json.JSONObject;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.List;import java.util.Map;/** * Author: jamky * Date: 2015/6/11 * Description: 主要应用于网络请求 */public class HttpUtils {    /**     * Http 远程请求     * @param context 非null时表示请求保持cookie同步,cookie的expires为17位utc时间格式     * @param url 可决定是否编码后再传过来, URLEncoder.encode("paramValue", "utf-8");     * @param requestMethod 请求方式:Flag.HTTP_GET , Flag.HTTP_POST     * @param requestType 请求返回数据的类型:Flag.STRING , Flag.BITMAP, Flag.DOC     * @param timeout 链接超时与读取超时,单位为秒     * @param handle 异步回调主体,常见代码: @Override handleMessage(Message msg); if (msg.what == 1); new Boolean(msg.obj.toString()).booleanValue();  new JSONObject(msg.obj.toString()); .setImageDrawable(new BitmapDrawable((Bitmap) msg.obj))     */    public static void  Request(final Context context,                                final String url,                                final int requestMethod,                                final int requestType,                                final int[] timeout,                                final Handler handle){        new Thread(){            @Override            public void run() {                try {                    Object object = Request(context,url,requestMethod,requestType,timeout);                    handle.obtainMessage(1, object).sendToTarget();                }catch (Exception e) {                    handle.obtainMessage(0, null).sendToTarget();                }            }        }.start();    }    public static Object Request(final Context context,                                 final String url,                                 final int requestMethod,                                 final int requestType,                                 final int[] timeout) throws Exception {        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();        //链接超时与读取超时        if (null!=timeout&&timeout.length>1){            conn.setConnectTimeout(timeout[0]*1000);            conn.setReadTimeout(timeout[1]*1000);        }        //POST请求配置        if (requestMethod == Flag.HTTP_POST){            conn.setRequestMethod("POST");//[OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE]            conn.setDoOutput(true);            conn.setUseCaches(false);            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");            //设置请求跟随重定向,如请求A,A跳转到B,A会返回302状态码,设置些跟随后获取到的状态码是200            //HttpURLConnection.setFollowRedirects(true);//作用于应用程序所有实例            conn.setInstanceFollowRedirects(true);//作用于当前实例            // 以上这些要在conn.connect()之前设置        }        //Cookie同步        if (null != context) {            //读cookie,绑定到请求,使会话持久化            String cookiesStr = WebViewCookie.G(context, url);            if (null != cookiesStr)                conn.setRequestProperty("Cookie", cookiesStr);            //写Cookie到本地Cookies数据库            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {                Map<String, List<String>> maps = conn.getHeaderFields();                List<String> cookies = maps.get("Set-Cookie");                if (null != cookies)                    WebViewCookie.C(context, cookies, url);            }        }        // 进行连接,实际上当执行到connection.getInputStream()时才真正地发出请求        conn.connect();        //请求若是POST        if (requestMethod == Flag.HTTP_POST){/*                      //post参数注入。实际测试post的参数直接追加在url后也是可以的                    //另外,要注意的是connection.getOutputStream会隐含的进行conn.connect(),故post请求时conn.connect()也可以注释掉                    DataOutputStream out = new DataOutputStream(conn.getOutputStream());                    String url_param = "param=" + URLEncoder.encode("参数值", "utf-8");                    out.writeBytes(url_param);// 将字符串中的16位unicode字符以8位字符形式写入流                    out.flush();                    out.close();*/        }        Object object = null;        switch (requestType){            case Flag.BITMAP:                object = BitmapFactory.decodeStream(conn.getInputStream());                break;            default:                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()) );                String s;                StringBuilder builder = new StringBuilder();                while ((s = reader.readLine())!= null) builder.append(s);                reader.close();                object = requestType==Flag.JSON? new JSONObject(builder.toString()) : builder.toString();        }        conn.disconnect();        return  object;    }}


0 0
原创粉丝点击