一、安卓中进行基于HTTP协议的网络访问
(1)HttpClient (apache开发)
(2)HttpURLConnection(google在发布安卓时在Java基础上修改得到的)
(3)使用HC(HttpClient)/UC(HttpURLConnection)进行网络访问的基本步骤:
0. 申请权限 INTERNET访问权限
1. 任何网络访问的相关代码,必须在工 作线程中执行!
2. 创建HC/UC对象
3. 声明发起网络访问的方式(GET/POST)
4. 进行网络连接
5. 获得服务器响应的结果
6. 解析结果,提取需要的内容
7. 解析结果要提交到UI线程进行呈现
利用HttpClient的POST方式发起带参数的请求
利用POST方式发起请求,参数要放到请求实体中,并且在请求头中添加对实体中参数的说明。
添加说明:
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
添加参数:
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);
登录界面参数提交
1)POST方式发起登录请求
2)要提交三个参数,参数应该放在请求实体中:
loginname:用户帐号
password:用户密码
code:验证码图片上的字符串(不区分大小写)
3) 要设置2个头:
第一个头用来描述请求实体中字符串
"Content-Type" "application/x-www-form-urlecoded"
第二个头用来提交sessionid
"Cookie" sid
在HttpClient中设置头:post.setHeader(key,value);
在HttpURLConnection中设置头:connection.setReqeustProperty(key ,value);
显示员工列表界面:ShowActivity
添加员工信息界面:EmpActivity
添加员工信息接口:
OnAddEmpFinishListener(){
void onAddFinish(String result);
}
业务流程:
1)登录成功后,跳转到显示所有员工信息的ShowActivity界面。界面中使用一个ListView来显示所有已经添加过的员工信息
2)ShowActivity界面中需要提供一个“添加”菜单或按钮,点击后跳转到员工
ty,进行员工信息的录入和添加
3)添加员工信息的时候,需要将内容封装为一个Emp实体类,实体类中有四个属性:
String name;
double salary;
int age;
String gender;//男性为m,女性为f
4)添加员工信息采用时提供监听器OnAddEmpFinishListener,里面提供一个回调方法,当服务器添加完成后会调用该回调方法,并将添加结果作为参数传入。
要求:做第4步添加的时候,分别用HttpClient、HttpURLConnection两种方式来进行!
public class RegistActivity extends Activity {//注册
EditText etName,etPassword,etRealname,etEmail; EmsBiz biz; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_regist); initView(); biz = new EmsBiz(this); }
private void initView() { etName = (EditText) findViewById(R.id.et_regist_name); etPassword = (EditText) findViewById(R.id.et_regist_password); etRealname = (EditText) findViewById(R.id.et_regist_realname); etEmail = (EditText) findViewById(R.id.et_regist_mail); }
public void backTo(View v){ //返回注册界面 finish(); }
public void registUser(View v){ User user = new User(); //判空 user.setName(etName.getText().toString()); user.setPassword(etPassword.getText().toString()); user.setRealname(etRealname.getText().toString()); user.setEmail(etEmail.getText().toString());
biz.registUser(user,new OnRegistFinishListener() { @Override public void onRegistFinish(String result) { if(result==null){ Toast.makeText(RegistActivity.this,"服务器异常稍后重试", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(RegistActivity.this, result, Toast.LENGTH_SHORT).show(); } } }); } } |
public class EmpActivity extends Activity {//添加员工
EditText etName,etSalary,etAge; RadioGroup rgGender; EmsBiz biz; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_emp); biz = new EmsBiz(this); initView(); }
private void initView() { etName = (EditText) findViewById(R.id.et_emp_name); etSalary = (EditText) findViewById(R.id.et_emp_salary); etAge = (EditText) findViewById(R.id.et_emp_age); rgGender = (RadioGroup) findViewById(R.id.rg_emp_gender); }
public void addemp(View v){ //判空
//判断数据类型(年龄,薪水应该为数字)
Emp emp = new Emp(); emp.setName(etName.getText().toString()); if(rgGender.getCheckedRadioButtonId()==R.id.rb_emp_male){ emp.setGender("m"); 单选项 }else{ emp.setGender("f"); } emp.setSalary(Double.parseDouble(etSalary.getText().toString())); emp.setAge(Integer.parseInt(etAge.getText().toString()));
biz.addEmp(emp,new OnAddEmpFinishListener() {
@Override public void onAddFinish(String result) {
Toast.makeText(EmpActivity.this, result, Toast.LENGTH_SHORT).show();
} }); }
public void showemp(View v){ finish(); } } |
public class MainActivity extends Activity { EditText etName,etPwd,etCode; ImageView ivVertify; EmsBiz biz; String sid;//用来保存服务生成验证码图片时的sessionid @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); biz = new EmsBiz(this); initView(); }
private void initView() { ivVertify = (ImageView) findViewById(R.id.iv_main_vertifycode); ivVertify.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(); }
private void refresh() { biz.getVertify(new OnRefreshVertifyCodeListener() {
@Override public void onRefreshFinished(Bitmap bitmap,String sessionid) { if(bitmap!=null) ivVertify.setImageBitmap(bitmap); sid = sessionid; Log.d("TAG", "sessionid= "+sid); } }); }
public void login(View v){ //应该加入判空 String loginname = etName.getText().toString(); String password = etPwd.getText().toString(); String code = etCode.getText().toString(); biz.login(loginname,password,code,sid,new OnLoginFinishListener() { @Override public void onLoginFinish(String result) { if(result!=null){ if(result.contains("ok")){ Intent intent = new Intent(MainActivity.this,ShowActivity.class); startActivity(intent); finish(); }else{ Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); refresh(); etPwd.setText(""); etCode.setText(""); } }else{ Toast.makeText(MainActivity.this, "服务器错误", Toast.LENGTH_SHORT).show(); } } }); }
public void regist(View v){ //跳转到“注册界面” Intent intent = new Intent(this,RegistActivity.class); startActivity(intent); } } |
package com.tarena.ems.util; public class EmsUtil {
public static void registUser(Context context, final User user, final OnRegistFinishListener listener) { new AsyncTask<Void, Void, String>() {
@Override protected String doInBackground(Void... params) {
try { HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("http://192.168.12.229:8080/ems/regist.do"); //添加一个请求头,对请求实体中的参数做一个说明 post.setHeader("Content-Type", "application/x-www-form-urlencoded"); //在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);
HttpResponse resp = client.execute(post); HttpEntity respEntity = resp.getEntity(); String line = EntityUtils.toString(respEntity); return line; } catch (Exception e) { e.printStackTrace(); } return null; }
protected void onPostExecute(String result) { listener.onRegistFinish(result); };
}.execute();
}
public static void registUser2(Context context,final User user, final OnRegistFinishListener listener){ //HttpURLConnection进行注册 new Thread(){ public void run() { try { URL url = new URL("http://192.168.12.229:8080/ems/regist.do"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoInput(true);//接收服务器响应的内容 connection.setDoOutput(true);//要向服务器提交内容 //在请求头中,为请求实体中的内容做说明 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.connect(); //客户端向服务器提交参数 OutputStream out = connection.getOutputStream(); PrintWriter pw = new PrintWriter(out, true); //String params = "loginname="+user.getName()+"&password="+user.getPassword()+"&realname="+user.getRealname()+"&email="+user.getEmail(); String params = getParams(user); pw.print(params); pw.close(); //客户端获取服务器的响应内容 InputStream in = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); final String result = br.readLine(); br.close(); //在主线程执行 new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override public void run() { listener.onRegistFinish(result); } });
} catch (Exception e) { e.printStackTrace(); } }; }.start();
}
protected static String getParams(User user) {//拼接字符串 Map<String,String> map = new HashMap<String, String>(); map.put("loginname", user.getName()); map.put("password", user.getPassword()); map.put("realname", user.getRealname()); map.put("email", user.getEmail());
StringBuilder sb = new StringBuilder();
for(Entry<String, String> entry:map.entrySet()){ sb.append(entry.getKey()). append("="). append(entry.getValue()). append("&"); }
return sb.substring(0, sb.length()-1); } //获取验证码 public static void getVertify(final OnRefreshVertifyCodeListener listener) { new AsyncTask<Void, Void, ValueObject>(){
@Override protected ValueObject doInBackground(Void... params) { try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet("http://192.168.12.229:8080/ems/getCode.do"); HttpResponse resp = client.execute(get); Header header = resp.getFirstHeader("Set-Cookie"); String value = header.getValue().split(";")[0]; HttpEntity entity = resp.getEntity(); InputStream is = entity.getContent(); Bitmap bitmap = BitmapFactory.decodeStream(is); is.close(); ValueObject vo = new ValueObject();新建一个类来作为不同类型的容器 vo.setBitmap(bitmap); vo.setSessionid(value);
return vo; } catch (Exception e) { e.printStackTrace(); } return null; } protected void onPostExecute(ValueObject result) { listener.onRefreshFinished(result.getBitmap(),result.getSessionid()); }; }.execute(); }
public static void getVertify2(final OnRefreshVertifyCodeListener listener){ new Thread(){ public void run() { try { URL url = new URL("http://192.168.12.229:8080/ems/getCode.do"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoInput(true); connection.connect();
final String value = connection.getHeaderField("Set-Cookie").split(";")[0]; InputStream is = connection.getInputStream(); final Bitmap bitmap = BitmapFactory.decodeStream(is); is.close(); new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override public void run() { listener.onRefreshFinished(bitmap,value); } }); } catch (Exception e) { e.printStackTrace(); } }; }.start(); }
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 client = new DefaultHttpClient(); HttpPost post = new HttpPost("http://192.168.12.229:8080/ems/login.do"); post.setHeader("Content-Type","application/x-www-form-urlencoded"); post.setHeader("Cookie",sid); 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();
} 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://192.168.12.229:8080/ems/login.do"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoInput(true); connection.setDoOutput(true); 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)); 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> entry:map.entrySet()){ sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } return sb.substring(0,sb.length()-1); }
public static void addEmp(final Emp emp, final OnAddEmpFinishListener listener) { new AsyncTask<Void, Void, String>(){
@Override protected String doInBackground(Void... params) { try { HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("http://192.168.12.229:8080/ems/addEmp"); post.setHeader("Content-Type","application/x-www-form-urlencoded"); List<NameValuePair> parameters = new ArrayList<NameValuePair>(); parameters.add(new BasicNameValuePair("name", emp.getName())); parameters.add(new BasicNameValuePair("salary",String.valueOf(emp.getSalary()))); parameters.add(new BasicNameValuePair("age", String.valueOf(emp.getAge()))); parameters.add(new BasicNameValuePair("gender", emp.getGender())); 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.onAddFinish(result); }; }.execute();
} public static void addEmp2(final Emp emp, final OnAddEmpFinishListener listener) {
new Thread(){ public void run() { try { URL url = new URL("http://192.168.12.229:8080/ems/addEmp"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.connect(); OutputStream out = connection.getOutputStream(); PrintWriter pw = new PrintWriter(out,true); pw.write(getParams(emp)); pw.close();
InputStream in = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); final String result = br.readLine(); br.close();
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override public void run() { listener.onAddFinish(result); } }); } catch (Exception e) { e.printStackTrace(); } }; }.start(); }
protected static String getParams(Emp emp) { Map<String , String> map = new HashMap<String, String>(); map.put("name", emp.getName()); map.put("salary", String.valueOf(emp.getSalary())); map.put("age", String.valueOf(emp.getAge())); map.put("gender",emp.getGender()); StringBuilder sb = new StringBuilder(); for(Entry<String, String> entry:map.entrySet()){ sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } return sb.substring(0,sb.length()-1); }
public static void getAllEmp(final OnLoadAllEmpFinishListener listener) { new AsyncTask<Void, Void, List<Emp>>(){
@Override protected List<Emp> doInBackground(Void... params) { try { Log.i("tag", "1"); URL url = new URL("http://192.168.12.229:8080/ems/listEmp"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream is = conn.getInputStream(); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; while ((len = is.read(data)) != -1) { outStream.write(data, 0, len); } byte[] bytes = outStream.toByteArray(); JSONArray array = new JSONArray(new String(data)); List<Emp> emps= new ArrayList<Emp>(); for (int i = 0; i < array.length(); i++) { Emp emp = new Emp(); JSONObject item = array.getJSONObject(i); emp.setName(item.getString("name")); emp.setSalary(Integer.valueOf(item.getString("salary"))); emp.setAge(Integer.valueOf(item.getString("age"))); emp.setGender(item.getString("gender")); Log.i("tag", "emp="+emp.toString()); emps.add(emp); }
Log.i("tag", "emps="+emps.toString()); Log.i("tag", "2"); is.close(); return emps;
} catch (Exception e) { e.printStackTrace(); } return null; } protected void onPostExecute(List<Emp> result) { Log.i("tag", "3"); listener.onfinish(result); };
}.execute();
} } |