HttpClient接口是由Apache提供的,如果要使用就必须在gradle文件的android节点下添加一句useLibrary “org.apache.http.legacy”,具体如下:
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
useLibrary "org.apache.http.legacy"
...
}
这样我们就可以开始使用HttpClient接口
使用步骤(get请求为例):
1、获取HttpClient对象,通常new一个DefaultHttpClient类;
HttpClient client=new DefaultHttpClient();
2、获取HttpGet对象,requestUrl这个字符串是我们要请求的Url
HttpGet get=new HttpGet(requestUrl);
3、可以设置一下请求头信息,通过HttpGet对象的addHeader方法
get.addHeader("Connection","keep-alive");
4、要想获取服务端的响应就要创建HttpResponse对象,通过如下方法就可以把请求和响应关联起来
HttpResponse response=client.execute(get);
5、之后就可以用响应对象response做响应操作
如获取响应状态码:
int statusCode=response.getStatusLine().getStatusCode();
通常只有状态码为200,我们才会继续操作,否则都不作过处理
例如状态码是200,我们就获取响应实体数据
HttpEntity entity=response.getEntity();
通过流的方式获取数据内容,字符串entityContent就是具体内容
InputStream is=entity.getContent();
String entityContent=read(is);
HttpClient接口的使用相当简单,但这里有两点要注意,一个是要授予上网权限
<uses-permission android:name="android.permission.INTERNET" />
一个是在高版本android关于网络请求的操作都要放到子线程来实现
最后下面有一个做了简单封装的工具类,其他不多说,直接上代码
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class HttpUtil {
static int responseCode=0;
public static void post(final String url, Map<String,String> params, final HttpCallListener listener){
//参数处理
final List<NameValuePair> data=new ArrayList<>();
Set<String> keys=params.keySet();
if(keys.size()>0){
for(String p:keys){
data.add(new BasicNameValuePair(p,params.get(p)));
}
}
final String requestUrl=url;
final List<NameValuePair> datas=data;
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient client=new DefaultHttpClient();
HttpPost post=new HttpPost(requestUrl);
post.addHeader("Connection","keep-alive");
post.setEntity(new UrlEncodedFormEntity(datas,"utf-8"));
//http响应对象
HttpResponse response=client.execute(post);
//http状态码
final int statusCode=response.getStatusLine().getStatusCode();
//获取实体数据
HttpEntity entity=response.getEntity();
//输入流
InputStream is=entity.getContent();
String entityContent=read(is);
is.close();
if(statusCode>=200&&statusCode<300){
listener.success(statusCode,entityContent);
}else {
listener.error(statusCode,entityContent);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public static void get(String url, Map<String,String> params, final HttpCallListener listener){
//参数处理
Set<String> keys=params.keySet();
StringBuilder stringBuilder=new StringBuilder();
if(keys.size()>0&&!url.endsWith("?")){
url+="?";
}
for(String p:keys){
stringBuilder.append(p+"="+params.get(p)+"&");
}
final String requestUrl=url;
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient client=new DefaultHttpClient();
HttpGet get=new HttpGet(requestUrl);
get.addHeader("Connection","keep-alive");
//http响应对象
HttpResponse response=client.execute(get);
//http状态码
int statusCode=response.getStatusLine().getStatusCode();
//获取实体数据
HttpEntity entity=response.getEntity();
//输入流
InputStream is=entity.getContent();
String entityContent=read(is);
is.close();
if(statusCode>=200&&statusCode<300){
listener.success(statusCode,entityContent);
}else {
listener.error(statusCode,entityContent);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
//监听请求返回结果的抽象类
public abstract static class HttpCallListener{
public abstract void success(int code,String data);
public abstract void error(int code,String data);
}
public static String read(InputStream is){
BufferedReader dr= null;
try {
dr = new BufferedReader(new InputStreamReader(is,"gbk"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
StringBuffer stringBuffer=new StringBuffer();
String line="";
try {
while ((line=dr.readLine())!=null){
stringBuffer.append(line+"\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuffer.toString();
}
}