java android HTTP应用程序设计

来源:互联网 发布:寻秦ol源码 编辑:程序博客网 时间:2024/04/16 23:49

使用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(String spec)           根据 String 表示形式创建 URL 对象。

URL(String protocol, String host, int port, String file)           根据指定 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();}if(fos!=null)try {fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.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 blocke.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{@Overridepublic 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);}@Overridepublic 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());}}}




1 0
原创粉丝点击