一.使用HttpURLConnection进行网络通信。HttpURLConnection类位于java.net包中,用于发送HTTP请求和获取HTTP响应,由于该类是抽象类,不能直接实例化对象,需要使用URL的openConnection()方法来获得。
1.使用HttpURLConnection发送GET请求。使用HttpURLConnection对象发送请求时,默认发送的就是GET请求。因此,发送GET请求比较简单,只是在指定连接地址时,先将要传递的参数通过“?参数名=参数值&参数名=参数值”等进行传递,然后获取流中的数据并关闭连接即可。
//使用HttpURLConnection发送GET请求(默认情况下HttpURLConnection使用GET请求)
public void HttpURLConnection_GET(){
//创建URL对象
try {
URL url = new URL("https://www.baidu.com/s?wd=你好");
//创建一个HTTP连接
try {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
Toast.makeText(myHttpURLConnection.this, "HTPP连接成功!", Toast.LENGTH_SHORT).show();
//设置请求超时
urlConnection.setReadTimeout(2000);//2秒
//获取数据
<span> </span>//断开连接
<span> </span>urlConnection.disconnect();
} catch (IOException e) {
System.out.println("HTPP连接出错!");
Toast.makeText(myHttpURLConnection.this, "HTPP连接出错!", Toast.LENGTH_SHORT).show();
}
} catch (MalformedURLException e) {
System.out.println("URL不存在!");
Toast.makeText(myHttpURLConnection.this, "URL不存在!", Toast.LENGTH_SHORT).show();
}
}
2.由于采用GET秦秋发送请求只适合发送大小在1024个字节以内的数据,所以当要发送的数据比较大的时候,就需要使用POST方式来发送该请求。在Android中,使用HttpURLConnection类在发送请求时,默认采用的是GET请求,如果发送POST请求,需要通过setRequestMethod()方法进行制定。
其它方法:
setDoInput(boolean newvalue):用于设置是否向连接中写入数据,如果参数值为true,表示写入数据,否则不写入数据。
setDoOutput(boolean newvalue):用于设置是否从连接中读取数据,如果参数值为true时,表示读取数据,否则不读取数据。
setUseCaches(boolean newvalue):用于这是是否缓存数据,true表示缓存数据,否则表示禁用缓存。
setInstanceFollwRedirects(boolean followRedirects):用于设置是否应该自动执行http重定向,true表示自动执行,否则不自动执行。
setRequestProperty(String field,String newValue):用于设置一般请求属性,列列如,要设置内容类型为表单数据,可以进行一下设置setRequestProperty("Content-Type","application/x-www/form-urlencodesd")。
//使用HttpURLConnection发送POST请求
public void HttpURLConnection_POST(){
//要提交的地址
String target = "http://www.baidu.com/";
URL url;
try {
url = new URL(target);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //创建http连接
conn.setRequestMethod("POST"); //指定使用POST请求方式
conn.setDoInput(true); //向连接中写入数据
conn.setDoOutput(true); //从连接中读取数据
conn.setUseCaches(false); //禁用缓存
conn.setInstanceFollowRedirects(true); //自动执行htpp重定向
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //设置内容类型
//获取数据,此处省略
//判断是否响应成功
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
}
conn.disconnect(); //断开连接
} catch (MalformedURLException e) {
System.out.println("URL不存在!");
Toast.makeText(myHttpURLConnection.this, "URL不存在!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
System.out.println("HTPP连接出错!");
Toast.makeText(myHttpURLConnection.this, "HTPP连接出错!", Toast.LENGTH_SHORT).show();
}
}
二.HttpURLConnection技术一般使用在到某个页面提交请求并获取服务器响应。不过,对于比较复杂的联网操作使用HttpURLConnection类就不一定能满足要求,这时,可以使用Apache组织提供的一个HttpClient项目实现。
1.发送GET请求。
//使用HttpClient的HttpGet类发送GET请求
public void HttpClient_GET(){
String target = "http://www.baidu.com/";
//创建HttpClient对象
HttpClient httpClient = new DefaultHttpClient();
//创建httpgGet连接对象
HttpGet httpRequest = new HttpGet(target);
HttpResponse httpResponse;
try {
//执行HttpClient请求
httpResponse = httpClient.execute(httpRequest);
/*
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//获取返回的字符串
String result = EntityUtils.toString(httpResponse.getEntity());
}else{
System.out.println("请求失败!");
Toast.makeText(myHttpURLConnection.this, "请求失败!", Toast.LENGTH_SHORT).show();
}*/
} catch (ClientProtocolException e) {
System.out.println("HttpClient请求失败!");
Toast.makeText(myHttpURLConnection.this, "HttpClient请求失败!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.发送POST请求
步骤: (1)创建HttpClient对象;
(2)创建HttpPOST对象;
(3)如果需要发送请求参数,可以调用HttpPOST的setParams或setEntity方法来添加请求参数;
(4)调用HttpClient对象的execute方法发送请求,执行该方法将返回一个HttpResponse对象;
(5)调用HttpResponse的getEntity方法,对获得包含了服务器响应内容的HttpEntity对象,通过该对象可以获取服务器的响应内容。
//使用HttpClient发送POST请求
public void HttpClient_POST(){
String target = "http://www.baidu.com/";
//创建HtppClient对象
HttpClient httpClient = new DefaultHttpClient();
//创建HttpPOST对象
HttpPost httpPost = new HttpPost(target);
//将要传递的参数保存到List集合中
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("param", "post")); //标记参数
params.add(new BasicNameValuePair("nick_name", "昵称"));
// HttpRequest.setEntity(new UrlEncodedFormEntity(params,"utf-8")); //设置编码方式
try {
//执行HttpClient请求
HttpResponse httpResponse = httpClient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
String result = EntityUtils.toString(httpResponse.getEntity()); //获取返回的字符串
}else{
Toast.makeText(myHttpURLConnection.this, "HttpClient请求失败!", Toast.LENGTH_SHORT).show();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}