我是靠谱客的博主 淡然酒窝,最近开发中收集的这篇文章主要介绍使用 HTTP 协议访问网络的两种方式:HttpURLConnection 和 HttpClient安卓中进行基于HTTP协议的网络访问,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

安卓中进行基于HTTP协议的网络访问

说明: HttpClient (apache开发)
HttpURLConnection(google在发布安卓时在Java基础上修改得到的)

使用HC(HttpClient)/UC(HttpURLConnection)进行网络访问的基本步骤:
0.申请权限 INTERNET访问权限
1. 任何网络访问的相关代码,必须在工作线程中执行!
2. 创建HC/UC对象
3. 声明发起网络访问的方式(GET/POST)
4. 进行网络连接
5. 获得服务器响应的结果
6. 解析结果,提取需要的内容
7. 解析结果要提交到UI线程进行呈现

  • 利用POST方式发起请求,参数要放到请求实体中,并且在请求头中添加对实体中参数的说明。例如:
添加参数:
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("loginname", user.getName()));
parameters.add(new BasicNameValuePair("password", user.getPassword()));
parameters.add(new BasicNameValuePair("realname", user.getRealname()));
parameters.add(new BasicNameValuePair("email", user.getEmail()));
HttpEntity entity = new UrlEncodedFormEntity(parameters);
post.setEntity(entity);
添加说明:
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
  • 在HttpClient中设置头: post.setHeader(key,value);
  • 在HttpURLConnection中设置头:
    connection.setReqeustProperty(key ,value);

建一个小项目进行说明

1. activity_main.xml 布局文件

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.ui.MainActivity" >

    <EditText
        android:id="@+id/et_main_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名..."
        android:textSize="16sp" />

    <EditText
        android:id="@+id/et_main_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:hint="请输入密码..."
        android:inputType="textPassword"
        android:textSize="16sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/et_main_vertifycode"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="3"
            android:hint="请输入验证码..."
            android:textSize="16sp" />

        <ImageView
            android:id="@+id/iv_main_vertifycode"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:src="@drawable/ic_launcher" />
    </LinearLayout>

    <View
        android:layout_width="1dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="regist"
        android:text="注册"
        android:textSize="16sp" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="login"
        android:text="登录"
        android:textSize="16sp" />


</LinearLayout>

效果图:
这里写图片描述

2. 建一个MainActivity 类

package com.example.ui;

import com.example.biz.EmsBiz;
import com.example.listener.OnLoginFinishListener;
import com.example.listener.OnRefreshVertifyCodeListener;
import com.example.web.R;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
    EditText etName,etPwd,etCode;
    EmsBiz biz;
    ImageView ivImageView;
    String sid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        biz=new EmsBiz(this);
        initView();//初始化界面
    }
    private void initView() {
        ivImageView=(ImageView) findViewById(R.id.iv_main_vertifycode);
        //验证码的监听器
        ivImageView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                refresh();//每点击一次验证码,就刷新一次
            }
        });
        etName = (EditText) findViewById(R.id.et_main_name);
        etPwd = (EditText) findViewById(R.id.et_main_password);
      etCode = (EditText) findViewById(R.id.et_main_vertifycode);
    }
    @Override
    protected void onResume() {
        super.onResume();
        //验证码的刷新
        refresh();
    }
    protected void refresh() {
       //为refresh()设置回调的getVertify方法
       //接口OnRefreshVertifyCodeListener(),并实现接口方法onRefreshFinished
        biz.getVertify(new OnRefreshVertifyCodeListener() {

            @Override
            public void onRefreshFinished(Bitmap bitmap, String sessionId) {
            if(bitmap!=null){
                ivImageView.setImageBitmap(bitmap);                     
            }
            }
        });
    }
    //“注册”按钮的onClick,跳转到“注册界面”
    public void regist(View v) {        
        Intent intent=new Intent(this,RegistActivity.class);
        startActivity(intent);
    }
    //“登录”按钮的onClick
    public void login(View v) {
        //应该加入判空
        String loginname = etName.getText().toString();
        String password = etPwd.getText().toString();
        String code = etCode.getText().toString();
        //与上面refresh()一样,添加回调监听
        biz.login(loginname,password,code,sid,new OnLoginFinishListener() {

            @Override
            public void OnLoginFinish(String result) {
                if(result!=null){
                    if(result.contains("ok")){
                    //加入Toast提示
                        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
                        refresh();
                        //如果输入不正确,将验证码和密码清空
                        etPwd.setText("");
                        etCode.setText("");
                    }
                }else{
                    Toast.makeText(MainActivity.this, "服务器错误", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

3. 建一个OnLoginFinishListener 接口

package com.example.listener;
public interface OnLoginFinishListener {
    void OnLoginFinish(String result);
}

4. 建一个EmsBiz 类

这个类属于管理层界面了,对于自己做小项目没有太大意义

package com.example.biz;

import com.example.Utli.EmsUtli;
import com.example.bean.Emp;
import com.example.bean.User;
import com.example.listener.OnAddEmpFinishListener;
import com.example.listener.OnLoginFinishListener;
import com.example.listener.OnRefreshVertifyCodeListener;
import com.example.listener.onRegistFinishListener;

import android.content.Context;
import android.util.Log;

public class EmsBiz {
    private Context context;
    public EmsBiz(Context context) {
        this.context = context;
    }

      //这里使用两种方式:HttpClient和HttpURLConnection       
    public void login(String loginname,String password,
String code,String sid,OnLoginFinishListener listener) {
        //EmsUtli.login(loginname,password,code,sid,listener);
        EmsUtli.login2(loginname,password,code,sid,listener);
    }
}

5. 最后再建一个EmsUtli类

package com.example.Utli;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;

import com.example.bean.Emp;
import com.example.bean.User;
import com.example.bean.ValueObject;
import com.example.listener.OnAddEmpFinishListener;
import com.example.listener.OnLoginFinishListener;
import com.example.listener.OnRefreshVertifyCodeListener;
import com.example.listener.onRegistFinishListener;

public class EmsUtli {
  //使用HttpClient方式
    public static void login(final String loginname, final String password, final String code,final String sid, final OnLoginFinishListener listener) {
        new AsyncTask<Void, Void, String>(){

            @Override
            protected String doInBackground(Void... params) {
                try {
                //HttpClient 是一个接口,因此无法创建它的实例,通常情况下都会创建一个DefaultHttpClient 的实例
                    HttpClient client= new DefaultHttpClient();
                    HttpPost post=new HttpPost("http://172.88.134.136:8080/ems/login.do");
                    //添加一个请求头,对请求实体中的参数做一个说明
                    //在HttpClient中设置头:post.setHeader(key,value);
                    post.setHeader("Cookie",sid);
                    post.setHeader("Content-Type","application/x-www-form-urlencoded");
                    //在post中添加请求参数
                    //请求参数会添加在请求实体中
                    List<NameValuePair>parameters = new ArrayList<NameValuePair>();
                    parameters.add(new BasicNameValuePair("loginname", loginname));
                    parameters.add(new BasicNameValuePair("password", password));
                    parameters.add(new BasicNameValuePair("code", code));
                    HttpEntity entity=new UrlEncodedFormEntity(parameters);
                    post.setEntity(entity);
                    HttpResponse resp=client.execute(post);
                    String result=EntityUtils.toString(resp.getEntity());                   
                    return result;              
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
            protected void onPostExecute(String result) {
                listener.OnLoginFinish(result);
            };

        }.execute();
    }

    //HttpURLConnection进行注册
    public static void login2(final String loginname, final String password, final String code,
            final String sid, final OnLoginFinishListener listener) {
        new Thread(){
            public void run() {
                try {
                    URL url=new URL("http://172.88.134.136:8080/ems/login.do");
                    HttpURLConnection connection=(HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("POST");
                    connection.setDoInput(true);//接收服务器响应的内容
                    connection.setDoOutput(true);//要向服务器提交内容
                    //在请求头中,为请求实体中的内容做说明
                    //在HttpURLConnection中设置头:connection.setReqeustProperty(key ,value);
                    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                    connection.setRequestProperty("Cookie", sid);
                    connection.connect();
                    OutputStream out=connection.getOutputStream();
                    PrintWriter pw=new PrintWriter(out,true);
                    pw.write(getParams(loginname,password,code));
                    pw.close();
                    //从客户端获取服务器的响应的内容
                    InputStream in=connection.getInputStream();
                    BufferedReader br=new BufferedReader(new InputStreamReader(in));
                    //在这里我们只有一行,所以这样写
                    //若为多行数据,需用:
                    /*StringBuilder sb=new StringBuilder();
                    while ((line=br.readLine())!=null) {
                        sb.append(line);
                    }*/
                    final String result=br.readLine();
                    br.close();
                        //在主线程执行
                    new Handler(Looper.getMainLooper()).post(new Runnable() {

                        @Override
                        public void run() {
                            listener.OnLoginFinish(result);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }
   //获得参数的方法
    protected static String getParams(String loginname, String password,
            String code) {
        Map<String, String> map=new HashMap<String,String>();
        map.put("loginname", loginname);
        map.put("password", password);
        map.put("code", code);
        StringBuilder sb=new StringBuilder();
        for(Entry<String, String> entity:map.entrySet()){
            sb.append(entity.getKey()).append("=").
            append(entity.getValue()).append("&");
        }
        //-1是为了减去最后的“&”字符
        return  sb.substring(0, sb.length()-1);
    }

别忘了在AndroidManifest.xml中注册

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

在这里我们选择了HttpURLConnection运行,将HttpClient进行了注释,比较推荐使用HttpURLConnection进行HTTP协议访问网络

最后

以上就是淡然酒窝为你收集整理的使用 HTTP 协议访问网络的两种方式:HttpURLConnection 和 HttpClient安卓中进行基于HTTP协议的网络访问的全部内容,希望文章能够帮你解决使用 HTTP 协议访问网络的两种方式:HttpURLConnection 和 HttpClient安卓中进行基于HTTP协议的网络访问所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部