Java-HTTP访问网络

一、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 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文件



<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_testtitle>

    <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

你可能感兴趣的:(Java)