最近在做一个项目的登录及注册,由于是菜鸟,所以在网上找了很多与服务器交互的方法,但很多时候都有点不太靠谱,于是经过一周和小伙伴的研究之后终于做出结果,所以将他给大家分享出来。
一、POST方法提交数据:
相对于GET方法提交数据,POST方法保密性更好,而且不用害怕出现中文传递给服务器上出现乱码,还得转换格式,再加上GET方法提交的数据相对有限,而POST方法一般无限制,因此我用的是POST方法来给大家展示android端如何向服务器提交数据。
//得到编辑框中的内容 final String userPhone=username1.getText().toString().trim(); final String userPwd=password1.getText().toString().trim(); //网络操作线程 new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection=null; try { //服务器对应的IP地址及端口 URL url=new URL("http://192.168.191.1:8088/WorryHousekeeping/ValidateUserLogin.android"); //打开HttpURLConnection connection=(HttpURLConnection)url.openConnection(); //请求方式为POST connection.setRequestMethod("POST"); //设置请求超时时间 connection.setConnectTimeout(8000); //定义输出流 OutputStream out=connection.getOutputStream(); //你需要输出的数据 String data="userPhone="+userPhone+"&userPwd="+userPwd; //输出数据,并转化为字节型式 out.write(data.getBytes()); //读取服务器的响应,通过UTF-8格式读取,因为服务器的中文格式为UTF-8 BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8")); String str=""; //对服务器的响应做出不同的处理方式,由于android中不能在子线程改变UI,所以通过handler进行转换 while ((str=reader.readLine())!=null){ Log.e("MainActivity",str); //注意str为服务器的响应,因此str必须与服务器端的响应结果是相同的 if (str.equals("没有该用户")){ Message msg=new Message(); msg.what=0x000; handler.sendMessage(msg); }else if (str.equals("密码错误")){ Message msg=new Message(); msg.what=0x001; handler.sendMessage(msg); }else{ //登陆成功跳转页面,服务器会返还一个xml或者其他文件,通过xml解析得到数据 Intent intent=new Intent(MainActivity.this,Main2Activity.class); startActivity(intent); } } }catch (Exception e){ e.printStackTrace(); }finally { } } }).start();
这里我们定义了一个Handler来将得到的数据发送到UI界面上,由于android规定无法在子线程中进行UI操作
Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what==0x123){ text2.append(msg.obj.toString()+"\n"); }else if (msg.what==0x000){ Toast.makeText(MainActivity.this,"没有该用户",Toast.LENGTH_SHORT).show(); }else if (msg.what==0x001){ Toast.makeText(MainActivity.this,"密码错误",Toast.LENGTH_SHORT).show(); } } };大家注意,所有的ID一定要和服务器上的ID保持一致,还有IP地址及端口号也要确定是否正确
二、GET方法得到服务器数据并xml解析:
//网络线程 new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection=null; BufferedReader reader=null; String u="http://192.168.191.1:8088/WorryHousekeeping/UsersToAndroid.android"; //从服务器拿出的数据 Integer id=0; String name=""; String phone=""; int sex=0; Integer age=0; String adress=""; String manner=""; try{ //服务器对应的IP地址及端口 URL url=new URL(u); //打开HttpURLConnection connection=(HttpURLConnection)url.openConnection(); //请求方式为GET connection.setRequestMethod("GET"); //网络超时限制 connection.setConnectTimeout(8000); //读取数据超时限制 connection.setReadTimeout(8000); //如果服务器响应 if (connection.getResponseCode()==200) { //得到服务器的数据 InputStream in = connection.getInputStream(); //xml格式解析数据 XmlPullParser parse = Xml.newPullParser(); //解析in中的数据,格式位utf-8 parse.setInput(in, "UTF-8"); //定义事件为解析事件 int event = parse.getEventType(); //如果解析事件不等于xml解析数据的结尾 while (event != XmlPullParser.END_DOCUMENT) { switch (event) { //当解析到数据的开头时,执行以下语句 case XmlPullParser.START_TAG: { //id为根节点,其余为子节点 if ("id".equals(parse.getName())) { id = Integer.parseInt(parse.getAttributeValue(0)); } else if ("name".equals(parse.getName())) { name = parse.nextText(); } else if ("phone".equals(parse.getName())) { phone = parse.nextText(); } else if ("sex".equals(parse.getName())) { sex = Integer.parseInt(parse.nextText()); } else if ("age".equals(parse.getName())) { age = Integer.parseInt(parse.nextText()); } else if ("address".equals(parse.getName())) { adress = parse.nextText(); }else if ("manner".equals(parse.getName())) { manner = parse.nextText(); } break; } case XmlPullParser.END_TAG: { Log.e("MainActivity",adress); String sex1=""; if (sex==0){ sex1="男"; }else { sex1="女"; } //将解析后的数据通过handler发送到ui线程中去 Message msg=new Message(); msg.what=0x123; msg.obj="您的id为"+id+"\n"+"您的姓名为"+name+"\n" +"您的手机号为"+phone+"\n"+"您的性别为"+sex1+"\n"+"您的年龄为"+age+"\n"+ "您的地址为"+adress+"\n"+"您的manner为"+manner; handler.sendMessage(msg); break; } default: break; } event=parse.next(); } } }catch (Exception e){ e.printStackTrace(); }finally { if (reader!=null){ try { reader.close(); }catch (Exception e){ e.printStackTrace(); } } } } }).start();同样,也是一个Handler显示数据,当然由于这次得到的数据进行字符分割,分别显示在不同的地方,不过由于这次主要介绍GET方法,所以就不这样做了,字符串分割什么的可以去看看JAVA书就行了,挺简单的
//定义全局变量
String s=""; Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what==0x123){ s=msg.obj.toString(); text.setText(s); } } };好了,这样的话就能将数据解析并显示
总结:android端的介绍只有这些,服务器端的其实并不难,做服务器的可以在网上搜索一下,这里我就不给大家分享了,毕竟我也只是学习路上的一只菜鸟,喜欢与大家分享,谢谢大家