Http学习之使用HttpURLConnection发送post和get请求
使用HttpURLConnection发送post和get请求
android httpUrlConnection 设置cookies
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;
}
}