Java-HTTP访问网络
2016-04-03 12:07
549 查看
一、HttpClient方式进行网络请求
访问网络可以使用Java.net包下的HttpURLConnection类,也可以使用Apache组织提供的一个HttpClient包来实现。在Android 5.0的sdk以前的版本中集成了HttpClient,Android 5.0以后的版本替换成了OkHttp了,今天的笔记主要整理关于HttpClient的使用。Android SDK 5.0以下的项目不需要导入jar包,如果是Java项目需要导入两个jar包:
httpcore-4.1.2.jar和httpclient-4.1.2.jar 资源链接:HttpClient方式网络请求的jar包.zip
HttpClient实际上是对Java访问网络的方法进行了封装。在HttpClient中被封装成了HttpGet、HttpPost和HttpResponse类,这样就减少了繁琐,其中HttpGet类代表发送GET请求,HttpPost类代表发送POST请求,HttpResponse类代表处理响应的对象。
1、发送GET请求
步骤:创建HttpClient对象
定义path,并创建HttpGet对象(如果需要发送请求参数,可以直接写到URL中,或者调用HttpGet的setParams()方法添加参数)
使用HttpClient对象的execute()方法发送get请求,并获取response对象
使用response对象获取statusLine对象
根据statusLine对象的statusCode判断响应结果
如果成功,则通过response对象获取HttpEntity对象
通过entity对象的getConent方法获取其输入流,读取服务端的响应信息
例:下载网络图片保存到本地
public class HttpclientTest { public static void main(String[] args) throws IOException, Exception { HttpClient client = new DefaultHttpClient(); String path = "http://img1.imgtn.bdimg.com/it/u=732519031,2395024188&fm=21&gp=0.jpg"; HttpGet get = new HttpGet(path); HttpResponse response = client.execute(get); StatusLine status = response.getStatusLine(); int statusCode = status.getStatusCode(); if(statusCode == HttpStatus.SC_OK){//响应码200 HttpEntity entity = response.getEntity(); //如果返回的HttpEntity是字符串,可以使用EntitiyUils工具类 //System.out.println(EntityUtils.toString(entity)); InputStream input = entity.getContent(); //复用 ByteArrayOutputStream bo = new ByteArrayOutputStream(); byte[] bs = new byte[1024]; int i; while((i=input.read(bs))!=-1){ //先写到内存中 bo.write(bs, 0, i); } //再一次性写入磁盘 OutputStream output = new FileOutputStream("d:/1_copy6.jpg"); output.write(bo.toByteArray()); System.out.println("图片下载完成"); output.close(); bo.close(); input.close(); } } }
2、发送POST请求
步骤:创建HttpClient对象
定义path,并创建HttpPost对象 –不带参数
创建NameValuePair对象,接收要传递的参数
创建List对象,添加要传递的所有参数
创建HttpEntity对象,将参数转换成UTF-8编码
post调用setEntity方法 接收
使用client对象发送post请求,并获取response对象
使用response对象获取statusLine对象
根据statusLine对象的statusCode判断响应结果
如果成功,则通过response对象获取HttpEntity对象
通过entity对象的getConent方法获取其输入流,读取服务端的响应信息
例:post方式模拟用户注册并返回注册结果
public class HttpClientTest3 { public static void main(String[] args) throws ClientProtocolException, IOException { HttpClient client = new DefaultHttpClient(); String name = "张三"; HttpPost post = new HttpPost("http://localhost:8080/remote/RegisterServlet"); NameValuePair nameVPir = new BasicNameValuePair("username",name); List<NameValuePair> params = new ArrayList<>(); params.add(nameVPir); HttpEntity entityParams = new UrlEncodedFormEntity(params,"utf-8"); post.setEntity(entityParams); HttpResponse response = client.execute(post); StatusLine status = response.getStatusLine(); int code = status.getStatusCode(); if (code == HttpStatus.SC_OK) {//响应码200 HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.toString(entity)); } } }
二、使用WebView组件访问网络
Android提供了内置的浏览器,该浏览器使用开源的WebKit引擎,WebKit不仅能搜索网址,查看邮件,而且能够播放视频节目。在Android中要使用这个内置的浏览器需要通过WebView组件来实现。1、WebView使用
1.1常用方法:public void loadUrl(String url)
(1)可以加载指定的URL对应的网页, webView.loadUrl(“http://www.csdn.net/“),
(2)加载assert目录下静态的网页文件webView.loadUrl(“file:///android_assert/test.html”)
(3)加载javascript,webView.loadUrl(“*.js”)
//用于将指定的字符串数据加载到浏览器中 loadData(String data,String mimeType,String encoding)
//用于基于URL加载指定的数据 mimeType类型默认text/html loadDataWithBaseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl)
//用于创建屏幕的快照 capturePicture()
//执行后退操作,相当于浏览器上的后退按钮的功能 goBack()
//执行前进操作,相当于浏览器上的前进按钮的功能 goForward()
//停止加载当前页面 stopLoading()
//刷新当前页面 reload()
1.2 APP内加载内容
WebView调用loadUrl()方法默认是加载系统的浏览器,而不是APP中的WebView加载,需要给创建一个WebViewClient对象传给WebView对象
webView.setWebViewClient(new WebViewClient())
1.3设置支持javascript
(1) WebView组件默认不支持javascript,要支持javascript需要通过WebView获得一个WebSettings对象,通过webSettings设置允许js:
websettings.setJavaScriptEnabled(true)
WebSettings还可以设置其他功能:
网页的放大缩小功能:
settings.setSupportZoom(true); settings.setBuiltInZoomControls(true);
网页自适应屏幕功能:
settings.setUseWideViewPort(true); settings.setLoadsImagesAutomatically(true);
(2) 设置了允许js后大部分javascript代码可用,但是对于通过Window.alert()方法弹出的对话框并不可用,还需要使用WebView组件的setWebChromeClient方法来处理javascript的对话框
webView.setWebChromeClient(new WebChromeClient())
WebChromeClient还提供了网页的加载进度值,可以设置一个进度条显示进度
1.4 webview中js和安卓原生的交互:
在android中定义一个类,其中的方法提供给js调用,方法前面要加上注解,否则会因为安全限制无法调用,如果是UI操作,需要发给UI线程执行class JsTest{ @JavascriptInterface public String sayHello() { return "Hello from android"; } @JavascriptInterface public void showAndroidButton(){ runOnUiThread(new Runnable() { @Override public void run() { btGo.setVisibility(View.VISIBLE); } }); } }
在assets目录中新建一个html文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- saved from url=(0032)http://localhost:8080/jsandroid/ --> <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Expires" content="0"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-store,no-cache"> <meta name="Handheldfriendly" content="true"> <meta name="viewport" content="width=100%; initial-scale=1.0; user-scalable=yes"> <meta name="robots" content="all"> <meta name="keywords" contect="doodle, mobile, doodlemobile, game, games"> <meta name="description" content="Make People's Mobile Life More Connected Through Games."> <title>jsandroid_test</title> <script type="text/javascript" language="javascript"> function sayHello(){ var str = window.jsObj.sayHello(); alert(str); } function showAndroidButton(){ window.jsObj.showAndroidButton(); } </script> </head> <body> hello IT-homer <br> <br> <br> <input type="button" value="sayHello" onclick="sayHello()" /> <br> <br> <br> <input type="button" value="showAndroidButton" onclick="showAndroidButton()" /> </body> </html>
把android中JsTest的对象关联为js中window下面的对象jsObj:
webView.addJavascriptInterface(new JsTest(), "jsObj");
Demo :WebViewDemo.zip
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析