HttpClient是专门设计用来简化HTTP客户端与服务器间各种通信,编程的,可以使复杂的事情变得简单。
注意: 在Android SDK编译版本为23的时,且使用HTTPClient相关类库项目的时候,如使用HttpClient会出现无法解析的错误, 这是由于android 6.0 (API 23) 不在提供 org.apache.http .* (只保留几个类)
HTTP请求方法中最常见的方法为 GET 与 POST:
GET 方法:
GET方法要求服务器将URL定位的资源放在想用报文的数据部分,会送给客户端,使用GET方法时,请求参数和对应的值附加在URL后面,利用一个(“?”)代表URL的结尾与请求参数的开始。
GET 方式特点:GET方式是不安全的 ,因为在传输过程中数据被放在请求的URL中,而如今现有的很多服务器代理服务器或者用户代理都会将请求URL记录到日志文件中,然后存放在某处, 这样一些隐私信息就可能会被第三方看到。
GET传输的数据两是有限的,主要受URL的限制,但是其传输速度快。
下面举例说明HTTpClient GET 的使用过程。
《 因为Android 中不允许在UI线程中进行耗时的操作,因此访问网路操作要放在工作线程中》
private void getRequest() {
new Thread(new Runnable() {
@Override
public void run() {
String path = "http://192.168.56.1:8080/HelloServlet/LoginServlet?username=wang&password=1234";
// 创建请求对象
HttpGet httpGet = new HttpGet(path);
// 创建Http客户端对象,用于实现发送请求
HttpClient client = new DefaultHttpClient();
try {
// 向服务器发送请求并返回响应对象
HttpResponse response =client.execute(httpGet);
// 获取响应的状态码
int staus= response.getStatusLine().getStatusCode();
switch (staus){
case HttpStatus.SC_OK://200
// 获取结果实体
HttpEntity entity= response.getEntity();
String result= EntityUtils.toString(entity, "utf-8");
System.out.println(result);
break;
case HttpStatus.SC_NOT_FOUND:// 404
break;
case HttpStatus.SC_INTERNAL_SERVER_ERROR:// 服务器异常(状态码500)
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
POST方式:POST方法要求被请求服务器接收请求的数据,常用于提交表单,当客户端给服务器提供信息较多时可以使用POST方法,POST方法将请求参数封装在HTTP请求数据中,以名称值得形式出现,可以传输大量数据但是速度慢。并且是安全的。
实例如下:(模仿用户注册的一个过程,将其写在一个方法中)
private void postRequest() {
new Thread(new Runnable() {
@Override
public void run() {
String path = "http://192.168.56.1:8080/HelloServlet/LoginServlet";
// 创建请求对象
//与get的差别在于传递参数的时候使用对NameValuePair对
HttpPost post = new HttpPost(path);
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username","wang"));
params.add(new BasicNameValuePair("password","1234"));
try {
HttpEntity entity = new UrlEncodedFormEntity(params);
post.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse responce = client.execute(post);
switch (responce.getStatusLine().getStatusCode()){ // 对服务器返回的状态码进行判断
case HttpStatus.SC_OK:
String result = EntityUtils.toString(responce.getEntity(),"utf-8");
System.out.println(result);
break;
case HttpStatus.SC_NOT_FOUND:
Log.i("HttpClient------->","404");
break;
case HttpStatus.SC_INTERNAL_SERVER_ERROR:
Log.i("HttpClient------->","500");
break;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}