在java中,我们一般使用Apache的HttpClient和Java的HttpURLConnection来进行网络请求.
一 HttpClient
HttpClient Apache提供的,非常好用,不到在安卓6.0及之后版本中,已经被移除,如果想要使用可以到下载以前版本的jar包引入项目.
HttpClient使用步骤:
1.创建HttpClient实例,可以使用系统自定义实例,也可以选择自定义一个HttpClient实例,自己配置一些参数.一般情况使用系统提供的实例就可以了
HttpClient httpClient = new DefaultHttpClient();
2.根据情况,选择是Post请求或者Get请求,关于Post.Get请求的基本知识不再这里介绍,不懂的可以自行百度.
2.1HttpGet
HttpGet mHttpGet = new HttpGet(url);//创建一个get请求
mHttpGet.addHeader("Connection", "Keep-Alive");//添加请求头
2.2 HttpPost
与get请求不一样,post请求的参数是放在请求体里的,get请求需要提交参数之间放在url后面.在java中使用一个NameValuePair来表示post请求附带的参数.
// HttpPost连接对象
HttpPost mHttpPost = new HttpPost(url);
// 使用NameValuePair来保存要传递的Post参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
// 添加要传递的参数
params.add(new BasicNameValuePair(key, value));
// 设置字符集
HttpEntity reqEntity = new UrlEncodedFormEntity(params, "Utf-8");
// 请求httpRequest
mHttpPost.setEntity(reqEntity);
HttpResponse httpResponse = httpClient.execute(httpGet);
4. httpClient对象执行execute方法会返回一个HttpResponse响应对象,利用这个响应的对象我们能够获得响应回来的状态码,如200,400,500 根据响应码的状态和决定下一步的处理.
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
4.1 将内容转为字符串
// 取得返回的字符串
result = EntityUtils.toString(httpResponse.getEntity());
// HttpEntity entity=httpResponse.getEntity();
// //转为字节数组
// byte[] data=EntityUtils.toByteArray(entity);
//拿到实体的输入流
inputStream = httpResponse.getEntity().getContent();
// 获取文件的总长度
long contentLength = httpResponse.getEntity()
.getContentLength();
int len = 0;
byte[] data = new byte[1024];
int totalLength = 0;
while ((len = inputStream.read(data)) != -1) {
totalLength += len;
int value = (int) ((totalLength / (float) contentLength) * 100);
publishProgress(value);
outputStream.write(data, 0, len);
}
byte[] result = outputStream.toByteArray();
byte[] b = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = is.read(b)) != -1){
//把读到的字节先写入字节数组输出流中存起来
bos.write(b, 0, len);
}
//把字节数组输出流中的内容转换成字符串
//默认使用utf-8
text = new String(bos.toByteArray());
5.对流关闭,连接关闭.
二 HttpURLConnection
HttpURLConnection是继承自URLConnection的一个抽象类.这个类包含了所需要的所有的操作.这个类默认是用的get方式提交数据.所以设置请求方式时如果是get请求可以不用设置请求头. Android 2.2版本以及之前的版本使用HttpClient是较好的选择,而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择,它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用
URL url = new URL(path);
//获取连接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置连接属性
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//建立连接,获取响应吗
if(conn.getResponseCode() == 200){
InputStream is =conn.getInputStream();
String text = Utils.getTextFromStream(is);
Message msg = handler.obtainMessage();
msg.obj = text;
handler.sendMessage(msg);
}
post方式附加参数:
//给请求头添加post多出来的两个属性
String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass;
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 第二个value值表示data.length() 表示字符串的长度
conn.setRequestProperty("Content-Length", data.length() + "");
//设置允许打开post请求的流
conn.setDoOutput(true);
//获取连接对象的输出流,往流里写要提交给服务器的数据
OutputStream os = conn.getOutputStream();
os.write(data.getBytes());
if(conn.getResponseCode() == 200){
InputStream is =conn.getInputStream();
String text = Utils.getTextFromStream(is);
Message msg = handler.obtainMessage();
msg.obj = text;
handler.sendMessage(msg);
}
三 第三方网络库
1.async-http框架
发送get请求
//创建异步的httpclient对象
AsyncHttpClient ahc = new AsyncHttpClient();
//发送get请求
ahc.get(path, new MyHandler());
//* 注意AsyncHttpResponseHandler两个方法的调用时机
class MyHandler extends AsyncHttpResponseHandler{
//http请求成功,返回码为200,系统回调此方法
@Override
public void onSuccess(int statusCode, Header[] headers,
//responseBody的内容就是服务器返回的数据
byte[] responseBody) {
Toast.makeText(MainActivity.this, new String(responseBody), 0).show();
}
//http请求失败,返回码不为200,系统回调此方法
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
Toast.makeText(MainActivity.this, "返回码不为200", 0).show();
}
}
发送post请求
* 使用RequestParams对象封装要携带的数据
//创建异步httpclient对象
AsyncHttpClient ahc = new AsyncHttpClient();
//创建RequestParams封装要携带的数据
RequestParams rp = new RequestParams();
rp.add("name", name);
rp.add("pass", pass);
//发送post请求
ahc.post(path, rp, new MyHandler());
2.xUtils使用
//创建HttpUtils对象
HttpUtils http = new HttpUtils();
//* 下载文件
http.download(url, //下载请求的网址
target, //下载的数据保存路径和文件名
true, //是否开启断点续传
true, //如果服务器响应头中包含了文件名,那么下载完毕后自动重命名
new RequestCallBack<File>() {//侦听下载状态
//下载成功此方法调用
@Override
public void onSuccess(ResponseInfo<File> arg0) {
tv.setText("下载成功" + arg0.result.getPath());
}
//下载失败此方法调用,比如文件已经下载、没有网络权限、文件访问不到,方法传入一个字符串参数告知失败原因
@Override
public void onFailure(HttpException arg0, String arg1) {
tv.setText("下载失败" + arg1);
}
//在下载过程中不断的调用,用于刷新进度条
@Override
public void onLoading(long total, long current, boolean isUploading) {
super.onLoading(total, current, isUploading);
//设置进度条总长度
pb.setMax((int) total);
//设置进度条当前进度
pb.setProgress((int) current);
tv_progress.setText(current * 100 / total + "%");
}
});