使用URL访问网络资源:
URL(Universal Resource Locator)统一资源定位符,是Internet上的标准资源地址,http协议通过URL来定位资源
URL组成:资料类型+存放资源的主机(域名)+资源文件名。
protocol://hostname[:port]/path/[;parameters][?query]#fragment
Protocol:传输协议
Hostname:主机名、域名、ip地址
Port:端口号
Path:资源路径
Parameters:用于指定特殊的参数
Query:给动态网页传递参数,多个参数用&分隔,参数为(名=值)对。
fragment:字符串,指定资源文件中的资源片段
使用URL访问网络资源(两种方法):
首先定义并初始化一个URL对象,然后调用下面两种方法:
URL(Stringspec) 根据 String 表示形式创建 URL 对象。
URL(Stringprotocol, Stringhost, intport, Stringfile) 根据指定 protocol、host、port 号和 file 创建 URL 对象。
第一种方法:
第二种方法:
第一种方法Example:
public class utlTools {
public static void saveToDisk(String urlStr,String filename){
byte[] buf=new byte[1024];
int len=0;
try {
URL url=new URL(urlStr);
FileOutputStream fos =new FileOutputStream(filename);
InputStream is=url.openStream();
while((len=is.read(buf))!=-1){
fos.write(buf,0,len);
}
is.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第二种例子Example:
public class httpTools{
public static void saveToDisk(String urlStr,String filename){
URL url=null;
InputStream is=null;
FileOutputStream fos=null;
byte[] buf=new byte[1024];
int len=0;
if(urlStr!=null)
try {
url=new URL(urlStr);
is=getinputStream(url);
fos=new FileOutputStream(filename);
if(is!=null){
while((len=is.read(buf))!=-1){
fos.write(buf, 0, len);
}
}
} catch (Exception e)
{
e.printStackTrace();
}
if(is!=null)
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(fos!=null)
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static InputStream getinputStream(URL url){
InputStream is=null;
HttpURLConnection httpcon=null;
try {
if(url!=null){
httpcon=(HttpURLConnection)url.openConnection();
httpcon.setConnectTimeout(3000);
httpcon.setDoInput(true);
httpcon.setRequestMethod("GET");
int responseCode=httpcon.getResponseCode();
if(responseCode==200)
is=httpcon.getInputStream();
}
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
}
测试类:
public class test {
public static void main(String[] args) {
String urlStr="http://192.168.1.19:8080/URLWebProject/images/mylogo.jpg";
String filename="c:\\tmp\\abc.jpg";
//utlTools.saveToDisk(urlStr, filename);
httpTools.saveToDisk(urlStr, filename);
}
}
GET请求与POST请求区别:
Get是从服务器上获取数据,Post是向服务器传递数据
对于Get方式,服务器端用request.QueryString获取变量值;对于Post方式,则采用request.form获取提交的数据
Get方式提交的数据最多只能有1024字节,post无限制
安全性问题:使用get方式,参数会显示在地址栏中,而post的参数是放在请求体中,不会直接出现在url中。
Get方式带参数的请求:
http://192.168.1.104:8080/android/getMessage,jsp?message=helloWorld
HttpURLConnection的使用方法:
httpURLConnection是URLConnection的子类,增加了一些用于操作http资源的方法,默认访问方法为get,如果想要以
post方式提交需要通过setResquestMethod()设置。
Get方式的HttpURLConnection的Example:
public class testGet {
public static InputStream getinputStream(URL url){
InputStream is=null;
HttpURLConnection httpcon=null;
try {
if(url!=null)
{
httpcon=(HttpURLConnection)url.openConnection();
httpcon.setConnectTimeout(3000);
httpcon.setDoInput(true);
httpcon.setRequestMethod("GET");
// httpcon.setRequestMethod("POST");
int responseCode=httpcon.getResponseCode();
if(responseCode==200)
is=httpcon.getInputStream();
}
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
public static void main(String[] args) {
String urlStr="http://192.168.1.19:8080/URLWebProject/servlet/loginAction";
InputStream is=null;
byte[] cbuf=new byte[1024];
int len=0;
try {
URL url=new URL(urlStr);
is=getinputStream(url);
while((len=is.read(cbuf))!=-1)
System.out.println(new String(cbuf,0,len));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Post方式的HttpURLConnection的Example:
public class testPost {
public static InputStream getinputStream(URL url){
InputStream is=null;
HttpURLConnection httpcon=null;
try {
if(url!=null){
httpcon=(HttpURLConnection)url.openConnection();
httpcon.setConnectTimeout(3000);
httpcon.setDoInput(true);
httpcon.setRequestMethod("POST");
int responseCode=httpcon.getResponseCode();
if(responseCode==200){
is=httpcon.getInputStream();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
public static void main(String[] args) {
String urlStr="http://192.168.1.19:8080/URLWebProject/servlet/loginAction";
InputStream is=null;
FileOutputStream fos=null;
byte[] cbuf=new byte[1024];
int len=0;
try {
URL url=new URL(urlStr);
is=getinputStream(url);
fos=new FileOutputStream("c:\\tmp\\mylogo.jpg");
while((len=is.read(cbuf))!=-1)
//System.out.println(new String(cbuf,0,len));
fos.write(cbuf, 0, len);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Apache的HttpClient:
Android中对于网络数据操作提供了三种接口:
基于标准java.net包接口,如:socket\url\utlconnection\httpURLConnection等
Android网络接口:对java标准接口的补充
Apache接口:org.apache.http.*提供了非常丰富的网络接口,弥补了java.net接口灵活性不够的缺点。对java.net标准接
口进行了封装,功能更为强大。
HttpClient:是apache接口中最重要的一个类,简单来说HttpClient是一个增强版的HttpURLConnection.
Android中已经集成了HttpClient,其使用步骤如下:
创建HttpClient对象;
如果需要发出get请求,创建HttpGet对象,如果需要发送post请求,创建HttpPost对象
如果需要发送请求参数,可调用HttpGet\HttpPost共同的setParams(HttpParams params)方法来添加请求参数,对于
HttpPost还可以用setEntity(HttpEntity entity)来设置。
调ttpUriRequest request)发送请求,执行该方法返回一个HttpResponse.,执行该方法返回一个HttpResponse.
调用HttpResponse的getHeaders(String str)等方法获取服务器响应的头;调用HttpResponse的getEntity()获取ttpEntity
对象,该对象包装了服务器响应的内容。
import java.util.ArrayList;
import java.util.List;
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 org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Main extends Activity implements OnClickListener{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnGetQuery = (Button) findViewById(R.id.btnGetQuery);
Button btnPostQuery = (Button) findViewById(R.id.btnPostQuery);
btnGetQuery.setOnClickListener(this);
btnPostQuery.setOnClickListener(this);
}
@Override
public void onClick(View view){
String url = "http://192.168.1.19:8080/querybooks/QueryServlet";
TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
EditText etBookName = (EditText) findViewById(R.id.etBookName);
HttpClient httpClient= new DefaultHttpClient();
HttpResponse httpResponse = null;
try{
switch (view.getId()){
// 提交HTTP GET请求
case R.id.btnGetQuery:
// 向url添加请求参数
url += "?bookname=" + etBookName.getText().toString();
// 第1步:创建HttpGet对象
HttpGet httpGet = new HttpGet(url);
// 第2步:使用execute方法发送HTTP GET请求,并返回HttpResponse对象
httpResponse = httpClient.execute(httpGet);
// 判断请求响应状态码,状态码为200表示服务端成功响应了客户端的请求
if (httpResponse.getStatusLine().getStatusCode() == 200)
{
// 第3步:使用getEntity方法获得返回结果
String result = EntityUtils.toString(httpResponse
.getEntity());
// 去掉返回结果中的“\r”字符,否则会在结果字符串后面显示一个小方格
tvQueryResult.setText(result.replaceAll("\r", ""));
}
break;
// 提交HTTP POST请求
case R.id.btnPostQuery:
// 第1步:创建HttpPost对象
HttpPost httpPost = new HttpPost(url);
// 设置HTTP POST请求参数必须用NameValuePair对象
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("bookname", etBookName
.getText().toString()));
// 设置HTTP POST请求参数
httpPost.setEntity(new UrlEncodedFormEntity(params,
HTTP.UTF_8));
// 第2步:使用execute方法发送HTTP POST请求,并返回HttpResponse对象
httpResponse =httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == 200){
// 第3步:使用getEntity方法获得返回结果
String result = EntityUtils.toString(httpResponse
.getEntity());
// 去掉返回结果中的“\r”字符,否则会在结果字符串后面显示一个小方格
tvQueryResult.setText(result.replaceAll("\r", ""));
}
break;
}
}
catch (Exception e){
tvQueryResult.setText(e.getMessage());
}
}
}