您的位置:首页 > 理论基础 > 计算机网络

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  apache sdk android 网络 class