android开发笔记之网络编程—使用HTTP进行网络编程

Posted minigeek

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android开发笔记之网络编程—使用HTTP进行网络编程相关的知识,希望对你有一定的参考价值。

上次我们讲到了使用URLConnection的网络编程,URLConnection已经可以非常方便地与指定站点交换信息,URLConnection下还有一个子类:HttpURLConnection。

HttpURLConnection在URLConnection的基础上进行改进,增加了一些用于操作HTTP资源的便捷方法。

setRequestMethod(String):设置发送请求的方法  

getResponseCode():获取服务器的响应代码

getResponseMessage():获取服务器的响应消息

a)get请求的代码:

conn=(HttpURLConnection)url.openConnection();

//注意要大写
conn.setRequestMethod("GET");

conn.setConnectTimeout(8000);//连接超时的毫秒数

conn.setReadTimeout(8000);//读取超时的毫秒数

b)post请求的代码

conn=(HttpURLConnection)url.openConnection();

//注意要大写
conn.setRequestMethod("POST");

c)关闭连接

   if(conn!=null)conn.disconnect();

注意需要的权限:

使用URLConnection的步骤:

①把网址填充成一个URL对象

URL url = new URL(String spec);

②获取客户端与服务器的连接对象,此时还没有连接

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

③对连接对象初始化

conn.setRequestMethod("GET"); //设置请求方式,注意大写
conn.setConnectTimeout(5000);//设置连接超时时间
conn.setReadTimeout(5000);//设置读取超时时间

④发送请求,建立连接

conn.connect();

⑤获取服务器响应中的流

InputStream is = conn.getInputStream();

⑥对流中的数据进行操作(如字符串、图片)

这里看一个使用HttpURLConnection下载图片的示例(只不过里面用了点小小的技巧,第一次加载网络图片,就将次图片缓存起来,以后加载就直接从缓存里取,不用访问网络):

效果:

这里写图片描述

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.briup.httpurlconnection.MainActivity">
    <Button
        android:onClick="onClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="加载图片"/>
    <ImageView
        android:id="@+id/iv" android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

MainActivity.java

package com.example.httpurlconnection;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;


public class MainActivity extends Activity {

    private ImageView iv;
    //网络图片的地址
    private String path = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
    public static final int SUCCESS = 0X1;  //成功加载的标志
    public static final int FAIL = 0X0;     //失败加载的标志
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SUCCESS:
                iv.setImageBitmap((Bitmap) msg.obj);
                break;
            case FAIL:
                Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_LONG).show();
                break;
            default:
                break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = (ImageView) findViewById(R.id.iv);
    }
    public void onClick(View view) {
        final File mFile = new File(getCacheDir(),"a2.jpg");
        //判断是否有缓存
        if (mFile.exists()) {//有缓存
            Toast.makeText(this,"使用缓存",Toast.LENGTH_LONG).show();
            Bitmap bitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
            iv.setImageBitmap(bitmap);
        }else {  //没有缓存,请求网络
            new Thread(){
                @Override
                public void run() {
                    try {
                        Toast.makeText(MainActivity.this,"没有缓存",Toast.LENGTH_LONG).show();
                        //1.把网址填充成一个URL对象
                        URL url = new URL(path);
                        //2.获取客户端与服务器的连接对象,此时还没有连接
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        //3.对连接对象初始化
                        conn.setRequestMethod("GET"); //设置请求方式,注意大写
                        conn.setConnectTimeout(5000);//设置连接超时时间
                        conn.setReadTimeout(5000);//设置读取超时时间
                        //4.发送请求,建立连接
                        conn.connect();
                        //返回码为200时表示请求成功
                        if (conn.getResponseCode() == 200) {
                            //获取服务器响应中的流
                            InputStream is = conn.getInputStream();
                            //把服务器的流中的数据写入本地文件,缓存起来
                            FileOutputStream fos = new FileOutputStream(mFile);
                            byte[] b = new byte[1024];
                            int len = 0;
                            while ((len = is.read(b)) != -1) {
                                fos.write(b,0,len);
                            }
                            fos.flush();
                            fos.close();
                            //此时流中已经没有了数据
                            //从文件中获取图片
                            Bitmap bitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
                            Message msg = Message.obtain();
                            //加载成功
                            msg.what = SUCCESS;
                            msg.obj = bitmap;
                            mHandler.sendMessage(msg);
                        }else {
                            Message msg = Message.obtain();
                            //加载失败
                            msg.what = FAIL;
                            mHandler.sendMessage(msg);
                        }
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
}

HttpURLConnection源码下载地址:http://download.csdn.net

——HttpClient

   android5.0之前.常用
   android5.0之后,被HttpURLConnecetion替代
   android6.0完全被舍弃

   HttpClient是Apache提供的Http网络访问接口。完成的功能和HttpURLConnection几乎一模一样的效果,但两者的用法有很大的差别。

  在一般情况下,如果只是需要向Web站点的某个简单页面提交请求并获取服务器响应,完全可以使用前面介绍的HttpURLConnection来完成,但是在绝大部分情况下,Web站点网页没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面,在这种情况下,就需要涉及Session,Cookie的处理了。

   HttpClient是一个简单的HTTP客户端,并不是浏览器。可以用于发送HTTP请求,接受HTTP响应,但不会缓存服务器的响应,不能执行html页面中嵌入的javascript代码,也不会对页面进行任何解析,处理。
   HttpClient会自动维护与服务器之间的Session状态,但是前提是使用同一个HttpClient对象发送请求。  

使用HttpClient的步骤:HttpClient是一个接口。

  a)创建HttpClient对象:new DefaultHttpClient();

  b)如果需要发送GET请求,创建HttpGet对象,并指定地址。
    如果需要发送Post请求,创建HttpPost对象,

  c)如果需要发送请求参数,可调用HttpGet,HttpPost共同的setParams(HttpParams)方法来添加请求参数,对于HttpPost对象而言,也可调用setEntity(HttpEntity)方法设置请求参数。
     使用HttpEntity下的UrlEncodedFormEntitiy对象传入一个放入BasicNameValuePair的集合中提交的数据。
     如:
HttpPost post=new HttpPost("");
List<NameValuePair> list=new ArrayList<>();
list.add(new BasicNameValuePair("name",name));
list.add(new BasicNameValuePair("pwd", pwd));
post.setEntity(new UrlEncodedFormEntity(list,"UTF-8"));

 d)调用HttpClient对象execute(HttpUriRequest)发送请求,执行该方法返回一个HttpResponse;

 e)调用HttpResponse的getstatusLine().getStatesCode()方法可以获取响应的状态码,如果是200就代码是成功的状态。调用HttpResponse的getEntity()方法获取HttpEntity对象,

该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。然后再用EntityUtils.toString(HttpEntity,"编码方式")将其转成为字符串。

——HttpClient返回不同数据的解析方式

a)返回普通的text数据

b)返回html数据

c)返回xml数据

 xml的解析可以采用sax,dom,dom4j,pull

d)返回JSON数据(在上次的文章JSON解析中提到过)

注意:

1.中文乱码问题:三种方式

String n=URLEncoder.encode(“张三”, “UTF-8”);

String n=EncodingUtils.getString(“张三”.getBytes(),”UTF-8”);该方式已经过时了

con.setRequestProperty(“Charset”, “UTF-8”);

2.HttpClient类把编译版本换到6.0以下应该就能用了,

在6.0的时候删除httpclient了,

在5.1他就过时了,官方不推荐使用了.

以上是关于android开发笔记之网络编程—使用HTTP进行网络编程的主要内容,如果未能解决你的问题,请参考以下文章

android开发笔记之网络编程—简易新闻客户端

Android学习笔记之Spinner下拉列表使用案例

Android开发之使用Web Service进行网络编程

Android异步载入学习笔记之四:利用缓存优化网络载入图片及ListView载入优化

android开发笔记之Gson解析

《android开发进阶从小工到专家》读书笔记--HTTP网络请求