在android中经常进行网络请求

目前了解的大概有三种


java.net包中的HttpURLConnection类


android的网络请求在4.0后都要求放在子线程中进行

实例



第二种是目前的主流方式

转载自http://blog.csdn.net/u014201191/article/details/49943707

  HTTP请求

当然在所有请求中最常用的还是GET与POST两种请求,创建请求的方式如下: 

HttpUriRequest request = newHttpPost("http://localhost/index.html");

HttpUriRequest request = newHttpGet(“http://127.0.0.1:8080/index.html”);

HTTP请求格式告诉我们,有两种方式可以为request提供参数:request-line方式与request-body方式。

Ø  request-line方式是指在请求行上通过URI直接提供参数。

(1)可以在生成request对象时提供带参数的URI,如:

HttpUriRequest request = newHttpGet("http://localhost/index.html?param1=value1¶m2=value2");

(2)HttpClient程序包还提供了URIUtils工具类,可以通过它生成带参数的URI,如: 

URI uri =URIUtils.createURI("http", "localhost", -1,"/index.html",

   "param1=value1¶m2=value2", null);

HttpUriRequest request = newHttpGet(uri);

System.out.println(request.getURI());

上例的实例结果如下:

 http://localhost/index.html?param1=value1¶m2=value2

(3)需要注意的是,如果参数中含有中文,需将参数进行URLEncoding处理,如:

 String param ="param1=" + URLEncoder.encode("中国", "UTF-8") +"¶m2=value2";

URI uri =URIUtils.createURI("http", "localhost", 8080,"/sshsky/index.html",param, null);

System.out.println(uri);

 上例的实例结果如下:

  http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD¶m2=value2

(4)对于参数的URLEncoding处理,HttpClient程序包为我们准备了另一个工具类:URLEncodedUtils。通过它,我们可以直观的(但是比较复杂)生成URI,如:

  1. List params = newArrayList();  
  2.   
  3. params.add(newBasicNameValuePair("param1""中国"));  
  4.   
  5. params.add(newBasicNameValuePair("param2""value2"));  
  6.   
  7. String param =URLEncodedUtils.format(params, "UTF-8");  
  8.   
  9. URI uri =URIUtils.createURI("http""localhost"8080,"/sshsky/index.html",param, null);  
  10.   
  11. System.out.println(uri);  

上例的实例结果如下:

  http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD¶m2=value2

Ø  request-body方式是指在请求的request-body中提供参数

与 request-line方式不同,request-body方式是在request-body中提供参数,此方式只能用于进行POST请求。在HttpClient程序包中有两个类可以完成此项工作,它们分别是UrlEncodedFormEntity类与MultipartEntity类。这 两个类均实现了HttpEntity接口。

(1)UrlEncodedFormEntity类,故名思意该类主要用于form表单提交。通过该类创建的对象可以模拟传统的HTML表单传送POST请求中的参数。如下面的表单:

[html] view plaincopyprint?
  1. <formactionformaction="http://localhost/index.html" method="POST">  
  2.   
  3.     <inputtypeinputtype="text" name="param1" value="中国"/>  
  4.   
  5.     <inputtypeinputtype="text" name="param2" value="value2"/>  
  6.   
  7.     <inupttypeinupttype="submit" value="submit"/>  
  8.   
  9. form>  

即可以通过下面的代码实现:

[java] view plaincopyprint?
  1. List formParams = newArrayList();  
  2.   
  3. formParams.add(newBasicNameValuePair("param1""中国"));  
  4.   
  5. formParams.add(newBasicNameValuePair("param2""value2"));  
  6.   
  7. HttpEntity entity = newUrlEncodedFormEntity(formParams, "UTF-8");  
  8.   
  9. HttpPost request = newHttpPost(“http://localhost/index.html”);  
  10.   
  11. request.setEntity(entity);  

 当然,如果想查看HTTP数据格式,可以通过HttpEntity对象的各种方法取得。如:

[java] view plaincopyprint?
  1. List formParams = newArrayList();  
  2.   
  3. formParams.add(newBasicNameValuePair("param1""中国"));  
  4.   
  5. formParams.add(newBasicNameValuePair("param2""value2"));  
  6.   
  7. UrlEncodedFormEntity entity =new UrlEncodedFormEntity(formParams, "UTF-8");  
  8.   
  9. System.out.println(entity.getContentType());  
  10.   
  11. System.out.println(entity.getContentLength());  
  12.   
  13. System.out.println(EntityUtils.getContentCharSet(entity));  
  14.   
  15. System.out.println(EntityUtils.toString(entity));  

上例的实例结果如下:

   Content-Type: application/x-www-form-urlencoded; charset=UTF-8

    39

    UTF-8

   param1=%E4%B8%AD%E5%9B%BD¶m2=value2 

(2)除了传统的application/x-www-form-urlencoded表单,还有另一个经常用到的是上传文件用的表单,这种表单的类型为 multipart/form-data。在HttpClient程序扩展包(HttpMime)中专门有一个类与之对应,那就是MultipartEntity类。此类同样实现了HttpEntity接口。如下面的表单:

[html] view plaincopyprint?
  1. <formactionformaction="http://localhost/index.html" method="POST"  
  2.   
  3.        enctype="multipart/form-data">  
  4.   
  5.     <inputtypeinputtype="text" name="param1" value="中国"/>  
  6.   
  7.     <inputtypeinputtype="text" name="param2" value="value2"/>  
  8.   
  9.     <inputtypeinputtype="file" name="param3"/>  
  10.   
  11.     <inupttypeinupttype="submit" value="submit"/>  
  12.   
  13. form>  

可以用下面的代码实现:

[java] view plaincopyprint?
  1. MultipartEntity entity = newMultipartEntity();  
  2.   
  3. entity.addPart("param1",new StringBody("中国", Charset.forName("UTF-8")));  
  4.   
  5. entity.addPart("param2",new StringBody("value2", Charset.forName("UTF-8")));  
  6.   
  7. entity.addPart("param3",new FileBody(new File("C:\\1.txt")));  
  8.   
  9. HttpPost request = newHttpPost(“http://localhost/index.html”);  
  10.   
  11. request.setEntity(entity);  

我们可以在上传文件或者模拟表单提交的时候,使用下列更多的方式,同样也满足流的处理

[html]  view plain  copy  print ?
  1. /*方法一*/  
  2. InputStreamBody inputStreamBody = new InputStreamBody(file, fileName);  
  3. MultipartEntity entity = new MultipartEntity();  
  4. //注意file是在后台中接受的参数File file  
  5. entity.addPart("file", inputStreamBody);  
  6. entity.addPart("name", new StringBody("value", Charset.forName("UTF-8")));  
  7. httpPost.setEntity(entity);  
  8.   
  9. /* 方法二  
  10.  * 跟方法一不同的就是 inputStreamBody 中可以接受的流参数  
  11.  */  
  12. InputStream in = new FileInputStream(new File("c:\\file.txt"));    
  13. InputStreamBody inputStreamBody = new InputStreamBody(in,    
  14.         "fileName");    
  15. MultipartEntity entity = new MultipartEntity();  
  16. entity.addPart("file", inputStreamBody);   
  17. httpPost.setEntity(entity);  
  18.   
  19. /*方法三  
  20.  * 使用表单FormBodyPart来模拟体检file  
  21.  */  
  22. ContentBody contentBody = new FileBody(new File("c:\\file.txt"));    
  23. FormBodyPart formBodyPart = new FormBodyPart("file", contentBody);    
  24. formBodyPart.addField("name", "value");  
  25. MultipartEntity entity = new MultipartEntity();  
  26. entity.addPart(formBodyPart);    
  27. httpPost.setEntity(entity);  
  28.   
  29. /*方法四  
  30.  * 将流转为二进制,进行传输  
  31.  */  
  32. FileInputStream in = new FileInputStream(new File(""));  
  33. byte[] b = new byte[1024];  
  34. in.read(b);  
  35. ByteArrayBody byteArrayBody = new ByteArrayBody(b, "android.jpg");    
  36. MultipartEntity entity = new MultipartEntity();  
  37. entity.addPart("file", byteArrayBody);  
  38. entity.addPart("name", new StringBody("value", Charset.forName("UTF-8")));  

实例和步骤:

try {
ArrayList arrayList = new ArrayList();
BasicNameValuePair nameValuePair = new BasicNameValuePair("username",userName);
BasicNameValuePair nameValuePair1 = new BasicNameValuePair("pwd",password);
arrayList.add(nameValuePair);
arrayList.add(nameValuePair1);
//使用HttpClient请求服务器将用户密码发送服务器验证
String url = "http://192.168.36.77:8567/itheima74/servlet/LoginServlet";
//1、创建一个httpClient对象
HttpClient client = new DefaultHttpClient();
//2、创建一个请求
HttpPost post = new HttpPost(url);
//设置要发送的集合
//创建一个Entity
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(arrayList,"utf-8");
//设置请求时的内容
post.setEntity(entity);
//3、执行http请求
HttpResponse response = client.execute(post);
//4.获取请求的状态码
if(response.getStatusLine().getStatusCode()==200){
HttpEntity responseEntity =  response.getEntity();
InputStream in = responseEntity.getContent();
//5.判断状态码后获取内容
//获取实体内容,中封装的有http请求返回的流信息
////将流信息转换成字符串
String result = StreamUtils.streamToString(in);
Message msg = Message.obtain();
msg.what=2;
msg.obj = result;
handler.sendMessage(msg);
}
第三种方式:开源项目 (asyncHttpClient) 

这是一个开源项目别人早封装好了,,只有调用就好。

get方式:




public static void requestNetForGetLogin(final Context context,final Handler handler ,final String username, final String password) {
//使用HttpClient请求服务器将用户密码发送服务器验证
try{
String path = "http://192.168.13.83:8080/alleged/servlet/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&pwd="+URLEncoder.encode(password,"utf-8");

//创建一个AsyncHttpClient对象
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.get(path, new AsyncHttpResponseHandler() {

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
//statusCode:状态码    headers:头信息  responseBody:返回的内容,返回的实体
//判断状态码
if(statusCode == 200){
//获取结果
try {
String result = new String(responseBody,"utf-8");
Toast.makeText(context, result, 0).show();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {

System.out.println("...............onFailure");

}
});
}catch (Exception e) {
e.printStackTrace();
}
}




post方式:




String path = "http://192.168.13.83:8080/alleged/servlet/LoginServlet";

AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("username", username);
params.put("pwd", password);

//url:   parmas:请求时携带的参数信息   responseHandler:是一个匿名内部类接受成功过失败
asyncHttpClient.post(path, params, new AsyncHttpResponseHandler() {

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
//statusCode:状态码    headers:头信息  responseBody:返回的内容,返回的实体

//判断状态码
if(statusCode == 200){
//获取结果
try {
String result = new String(responseBody,"utf-8");
Toast.makeText(context, result, 0).show();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {

}
});



更多相关文章

  1. Android三种定位方式
  2. Android(安卓)网络框架 Retrofit 源码解析
  3. android vsnc 工作原理
  4. Android中使用SAX方式解析XML文件
  5. 内容提供者相关技术
  6. 布局中文件中【控件间距参数详解以及单位选择】
  7. Android数据存储方式
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. android 已省内存方式把图片加载到内存
  2. Android中shape的使用
  3. android的Menu使用
  4. Android国际化资源 文件夹命名规范
  5. android 清除所有activity
  6. android 签名
  7. Android(安卓)多线程编程 一个游戏程序员
  8. Android系统权限和root权限大全
  9. Android(安卓)Introduce(I)concepts and
  10. Android设备开发中的一些解决办法