使用URL访问网络资源

1、URL对象代表统一资源定位器,它是指向互联网“资源”的指针。例如对数据库或搜索引擎的查询。URL可以由协议名、主机、端口和资源组成。即:protocol://host:port/resourceName         例如:http://www.crazyit.org/index.php

2、URL类提供了多个构造方法用于创建URL对象,一旦获得了 URL对象之后,可以调用如下常用方法来访问该URL对应的资源:

1) StringgetFile():获取此URL的资源名。

2) StringgetHost():获取此URL的主机名。

3) StringgetPath():获取此URL的路径部分。

4) Int getPort():获取此URL的端口号。

5) StringgetProtocol():获取此 URL 的协议名称。

6)String getQuery():获取URL的查询字符串部分

7)URLConnection openConnection():

8)InputStream openStream():打开与此URL的链接,并返回一个用于读取该URL资源的InputStream

3、使用URL读取网络资源

public class MainActivity extends AppCompatActivity {

    ImageView show;
    //代表从网络下载的图片
    Bitmap bitmap;
    Handler handler=new Handler(){

        @Override
        public void handleMessage(Message msg) {
            if (msg.what==0x123){//这个值就是一个标志,handle接受多个message的时候,进行区分给与对应操作的
                //调用Image显示图片
                show.setImageBitmap(bitmap);
            }
        }
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show= (ImageView) findViewById(R.id.imgShow);

        //创建并启动一个新线程用于从网络上下载图片
        new Thread(){
            @Override
            public void run() {
                try {
                    //创建一个URL对象
                    URL url=new URL("http://avatar.csdn.net/1/1/E/1_fengyuzhengfan.jpg");
                    //打开URL对应的资源输入流
                    InputStream is=url.openStream();
                    //把InputStream转化成ByteArrayOutputStream
                    ByteArrayOutputStream baos=new ByteArrayOutputStream();

                    byte[] buffer=new byte[1024];
                    int len;
                    while((len=is.read(buffer))>-1){
                        baos.write(buffer,0,len);
                    }
                    baos.flush();
                    is.close();//关闭输入流
                    //将ByteArrayOutputStream转化成InputStream
                    is=new ByteArrayInputStream(baos.toByteArray());

                    //将InputStream解析成Bitmap
                    bitmap= BitmapFactory.decodeStream(is);

                    //通知UI线程显示图片
                    handler.sendEmptyMessage(0x123);

                    //再次将ByteArrayOutputStream转化成InputStream
                    is=new ByteArrayInputStream(baos.toByteArray());

                    baos.close();

                    //打开手机文件对应的输出流
                    OutputStream os=openFileOutput("dw.jpg",MODE_PRIVATE);//手机对应的文件名
                    byte[] buff=new byte[1024];
                    int count=0;
                    //将URL对应的资源下载到本地
                    while ((count=is.read(buff))>0){
                        os.write(buff,0,count);
                    }
                    os.flush();
                    //关闭输入输出流
                    os.close();
                    is.close();
                }  catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }
}

4、因为程序需要访问互联网,所以需要授予该程序访问网络的权限,也就是需要在 AndroidManifest.xml文件中增加如下授权代码:

<!-- 授权访问网络-->

<uses-permissionandroid:name="android.permission.INTERNET"/>

1、使用 URLConnection 提交请求

 URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和URL之间的通信连接。程序可以通过URLConnection实例向URL发送请求,读取URL引用的资源。

通常创建一个和URL的连接,并发送请求、读取此URL引用的资源需要如下几个步骤:

1)通过调用URL对象openConnection()方法来创建URLConnection对象。

2) 设置URLConnection的参数和普通请求属性。

3) 如果只是发送GET方式请求,使用connect方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数,即是GET方法不需要传参,POST方法需要传参。

4) 远程资源变为可用,程序可以访问远程资源的头字段,或通过输入流读取远程资源的数据。

在建立和远程资源的实际连接之前,程序可以通过如下方法来设置请求头字段:

Ø setAllowUserlnteraction:设置该URLConnection 的allowUserlnteraction 请求头字段的值。

Ø setDoInput:设置该URLConnection的dolnput请求头字段的值。

Ø setDoOutput:设置该 URLConnection 的doOutput请求头字段的值。

Ø setlfModifiedSince:设置该URLConnection 的ifModifiedSince 请求头字段的值。

Ø setUseCaches:设置该 URLConnection 的 useCaches 请求头字段的值。

Ø setRequestProperty(String key, String value):设置该URLConnection 的 key 请求头字段的值为value。如以下代码所示:

conn.setRequestProperty("accept", "*/*")

Ø addRequestProperty(String key, String value):为该URLConnection 的 key 请求头字段的增加value值。该方法并不会播盖原请求头字段的值,而是将新值追加到原请求头字段中。

Ø Object getContent():获取该 URLConnection 的内容。

Ø String getHeaderField(String name):获取指定响应头字段的值。

Ø getlnputStream():返回该URLConnection对应的输入流,用于获取URLConnection响应的内容。

Ø getOutputStream():返回该URLConnection 对应的输出流,用于向URLConnection发送请求参数。

注意:如果既要使用输入流读取URLConnection响应的内容,也要使用输出流发送请求参数,一定要先使用输出流,再使用输入流。

getHeaderField()方法用于根据响应头字段来返回对应的值。而某些头字段由于经常需要访问,所以Java提供了以下方法来访问特定响应头字段的值。

Ø getContentEncoding:获取 content-encoding 响应头字段的值。

Ø getContentLength:获取 content-length 响应头字段的值。

Ø getContentType:获取 content-type 响应头字段的值。

Ø getDate():获取date响应头字段的值。

Ø getExpiration():获取expires响应头字段的值。

Ø getLastModified():获取 last-modified 响应头字段的值。








猜你喜欢

转载自blog.csdn.net/magicmhd/article/details/80353308