Android请求服务器的两种方式--post, get的区别

android中用get和post方式向服务器提交请求疯狂之桥新浪博客
http://blog.sina.com.cn/s/blog_a46817ff01017yxt.html
Android提交数据到服务器的两种方式四种方法 - 从不曾离开的只有自由和梦想! - ITeye技术网站
http://keeponmoving.iteye.com/blog/1528472
android端向服务器提交请求的几种方式 - Android移动开发技术文章_手机开发 - 红黑联盟
http://www.2cto.com/kf/201309/242510.html


// android中向服务器提交请求的两种方式和四种方法

private String addr = "http://192.168.2.101:80/serlet/loginServlet";

/* 1. 在android中用get方式向服务器提交请求 */

public boolean get(String username, String password) throws Exception {
username = URLEncoder.encode(username);
password = URLEncoder.encode(password);
String params = "Username = " + username + "&password = " + password;
//将参数拼接在URl地址后面
URL url = new URL(address + "?" + params);
//通过url地址打开连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置超时时间
conn.setConnectTimeout(3000);
//设置请求方式
conn.setRequestMethod("GET");
return conn.getResponseCode() == 200;
}


/* 2. HttpGet方式向服务器提交请求 --HttpClient */

//获得要传递的数据
String username = et1.getText().toString();
String password = et2.getText().toString();

// 创建HttpGet对象
HttpGet request = new HttpGet(url +"name="+username+"&password="+password);
// 使用execute方法发送HTTP GET请求,并返回HttpResponse对象
// DefaultHttpClient为Http客户端管理类,负责发送请
HttpResponse response = httpClient.execute(request);
// 判断请求响应状态码,状态码为200表示服务端成功响应了客户端的请求
if (response.getStatusLine().getStatusCode() == 200) {
     // 使用getEntity方法获得返回结果
     String data = EntityUtils.toString(response.getEntity(),"gbk");
     //获得Message对象
     Message msg = handler.obtainMessage(1);
    //创建Bundle对象
     Bundle bundle = new Bundle();
     //用mes传递数据
     msg.setData(bundle);
    //开启Message对象
     msg.sendToTarget();
}

/* 3. post 方式向服务器提交请求 */
public boolean post(String username, String password)     throws Exception {
username = URLEncoder.encode(username); // 中文数据需要经过URL编码
password = URLEncoder.encode(password);
String params = "username=" + username + "&password=" + password;
byte[] data = params.getBytes();

URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
//这是请求方式为POST
conn.setRequestMethod("POST");
//设置post请求必要的请求头
// 请求头, 必须设置
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
// 注意是字节长度, 不是字符长度
conn.setRequestProperty("Content-Length", data.length + ""); 

conn.setDoOutput(true); // 准备写出
conn.getOutputStream().write(data); // 写出数据

return conn.getResponseCode() == 200;
}


/* 4. HttpPost方式向服务器提交请求 --HttpClient */

把来传递的数据封装到user对象中

User user = new User();

user.setUserName(et1.getText().toString());

user.setUserPass(et2.getText().toString());

//创建Post对象
HttpPost request = new HttpPost("http://10.0.2.2:8080/system/Servlet");

// 将需要传递的参数封装到List<NameValuePair>类型的对象中
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", user.getUserName()));
params.add(new BasicNameValuePair("password", user.getUserPass()));

// 将封装参数的对象存入request中,并设置编码方式
request.setEntity(new UrlEncodedFormEntity(params,
  HTTP.UTF_8));

// DefaultHttpClient为Http客户端管理类,负责发送请求和接受响应
HttpResponse response = defaultHttpClient.execute(request);

// 判断请求响应状态码,状态码为200表示服务端成功响应了客户端的请求
if (response.getStatusLine().getStatusCode() == 200) {
     // 使用getEntity方法获得返回结果
     String data = EntityUtils.toString(response.getEntity(),"gdk");
     //创建bundle对象
     Bundle bundle = new Bundle();
     //用bundle对象来封装data数据
     bundle.putString("data", data);
     //创建Message对象
     Message mes = handler.obtainMessage(1);
     //存储bundle数据
     mes.setData(bundle);

     mes.sendToTarget();
}

/**
 * @author Dylan
 * 本类封装了Android中向web服务器提交数据的两种方式四种方法
 */
public class SubmitDataByHttpClientAndOrdinaryWay {

/**
 * 使用get请求以普通方式提交数据
 * @param map 传递进来的数据,以map的形式进行了封装
 * @param path 要求服务器servlet的地址
 * @return 返回的boolean类型的参数
 * @throws Exception
 */
public Boolean submitDataByDoGet(Map<String, String> map, String path) throws Exception {
    // 拼凑出请求地址
    StringBuilder sb = new StringBuilder(path);
    sb.append("?");
    for (Map.Entry<String, String> entry : map.entrySet()) {
        sb.append(entry.getKey()).append("=").append(entry.getValue());
        sb.append("&");
    }
    sb.deleteCharAt(sb.length() - 1);
    String str = sb.toString();
    System.out.println(str);
    URL Url = new URL(str);
    HttpURLConnection HttpConn = (HttpURLConnection) Url.openConnection();
    HttpConn.setRequestMethod("GET");
    HttpConn.setReadTimeout(5000);
    // GET方式的请求不用设置什么DoOutPut()之类的吗?
    if (HttpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
        return true;
    }
    return false;
}

/**
 * 普通方式的DoPost请求提交数据
 * @param map 传递进来的数据,以map的形式进行了封装
 * @param path 要求服务器servlet的地址
 * @return 返回的boolean类型的参数
 * @throws Exception
 */
public Boolean submitDataByDoPost(Map<String, String> map, String path) throws Exception {
    // 注意Post地址中是不带参数的,所以newURL的时候要注意不能加上后面的参数
    URL Url = new URL(path);
    // Post方式提交的时候参数和URL是分开提交的,参数形式是这样子的:name=y&age=6
    StringBuilder sb = new StringBuilder();
    // sb.append("?");
    for (Map.Entry<String, String> entry : map.entrySet()) {
        sb.append(entry.getKey()).append("=").append(entry.getValue());
        sb.append("&");
    }
    sb.deleteCharAt(sb.length() - 1);
    String str = sb.toString();

    HttpURLConnection HttpConn = (HttpURLConnection) Url.openConnection();
    HttpConn.setRequestMethod("POST");
    HttpConn.setReadTimeout(5000);
    HttpConn.setDoOutput(true);
    HttpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    HttpConn.setRequestProperty("Content-Length", String.valueOf(str.getBytes().length));
    OutputStream os = HttpConn.getOutputStream();
    os.write(str.getBytes());
    if (HttpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
        return true;
    }
    return false;
}

/**
 * 以HttpClient的DoGet方式向服务器发送请数据
 * @param map 传递进来的数据,以map的形式进行了封装
 * @param path 要求服务器servlet的地址
 * @return 返回的boolean类型的参数
 * @throws Exception
 */
public Boolean submitDataByHttpClientDoGet(Map<String, String> map, String path) throws Exception {
    HttpClient hc = new DefaultHttpClient();
    // 请求路径
    StringBuilder sb = new StringBuilder(path);
    sb.append("?");
    for (Map.Entry<String, String> entry : map.entrySet()) {
        sb.append(entry.getKey()).append("=").append(entry.getValue());
        sb.append("&");
    }
    sb.deleteCharAt(sb.length() - 1);
    String str = sb.toString();
    System.out.println(str);
    HttpGet request = new HttpGet(sb.toString());

    HttpResponse response = hc.execute(request);
    if (response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK) {
        return true;
    }
    return false;
}

/**
 * 以HttpClient的DoPost方式提交数据到服务器
 * @param map 传递进来的数据,以map的形式进行了封装
 * @param path 要求服务器servlet的地址
 * @return 返回的boolean类型的参数
 * @throws Exception
 */
public Boolean submintDataByHttpClientDoPost(Map<String, String> map, String path) throws Exception {
    // 1. 获得一个相当于浏览器对象HttpClient,使用这个接口的实现类来创建对象,DefaultHttpClient
    HttpClient hc = new DefaultHttpClient();
    // DoPost方式请求的时候设置请求,关键是路径
    HttpPost request = new HttpPost(path);
    // 2. 为请求设置请求参数,也即是将要上传到web服务器上的参数
    List<NameValuePair> parameters = new ArrayList<NameValuePair>();
    for (Map.Entry<String, String> entry : map.entrySet()) {
        NameValuePair nameValuePairs = new BasicNameValuePair(entry.getKey(), entry.getValue());
        parameters.add(nameValuePairs);
    }
    // 请求实体HttpEntity也是一个接口,我们用它的实现类UrlEncodedFormEntity来创建对象,注意后面一个String类型的参数是用来指定编码的
    HttpEntity entity = new UrlEncodedFormEntity(parameters, "UTF-8");
    request.setEntity(entity);
    // 3. 执行请求
    HttpResponse response = hc.execute(request);
    // 4. 通过返回码来判断请求成功与否
    if (response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK) {
        return true;
    }
    return false;
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容