我是靠谱客的博主 淡然酒窝,最近开发中收集的这篇文章主要介绍使用 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协议的网络访问所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复