Android开发:客户端与服务器通过传递和接收json数据进行交互
email:chentravelling@163.com
开发环境:win7 64位,Android Studio。
一.前言
今天跷了上午的课、跷了下午的一个会议,专门写了一个注册,没想到居然花了我足足7个小时,也确实是因为第一次做App和服务器的交互,以及最开始就想把界面做漂亮、注册时的验证也完成,前前后后真是花费了很多时间。最终实现了,那么后期还有很多前后端交互的工作就易如反掌了。
本文只涉及post方式,如果想看get方式,可参考《Android studio 百度地图开发(5)查询周边服务(加油站)》或者其他资料。
二.app端实现
1.注册界面
虽然想做的很棒,但是实际上,看着还是有点low~
(1)主界面activity_register.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/login_backgrouond">
<!-- padding 内边距 layout_margin 外边距
android:layout_alignParentTop 布局的位置是否处于顶部 -->
<RelativeLayout
android:id="@+id/login_div"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="15dip"
android:layout_margin="15dip"
android:background="#93ffffff" >
<!-- 账号 -->
<TextView
android:id="@+id/login_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="5dp"
android:text="账 号" />
<EditText
android:id="@+id/user_phone_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="手 机 号"
android:layout_below="@id/login_user"
android:singleLine="true"
android:inputType="text"/>
<!-- 姓名 text -->
<TextView
android:id="@+id/user_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/user_phone_input"
android:layout_marginTop="3dp"
android:text="姓 名"/>
<EditText
android:id="@+id/user_name_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/user_name"
android:singleLine="true"
android:inputType="text" />
<!-- 身份证号码 text -->
<TextView
android:id="@+id/user_id_card"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/user_name_input"
android:layout_marginTop="3dp"
android:text="身份证号码"/>
<EditText
android:id="@+id/user_id_card_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/user_id_card"
android:singleLine="true"
android:inputType="text" />
<!-- 密码 text -->
<TextView
android:id="@+id/user_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/user_id_card_input"
android:layout_marginTop="3dp"
android:text="密 码"/>
<EditText
android:id="@+id/user_password_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/user_password"
android:password="true"
android:singleLine="true"
android:inputType="textPassword" />
<!-- 重复输入密码 text -->
<TextView
android:id="@+id/user_password_"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/user_password_input"
android:layout_marginTop="3dp"
android:text="确认密码"/>
<EditText
android:id="@+id/user_password_input_d"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/user_password_"
android:password="true"
android:singleLine="true"
android:inputType="textPassword" />
<!-- 登录button -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/warnText"
android:layout_below="@id/user_password_input_d"
android:textSize="15dp"
android:textColor="#ff0000" />
<Button
android:id="@+id/register_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/warnText"
android:layout_alignRight="@id/user_password"
android:text="注 册"
android:background="#4FC1FB"
android:layout_alignLeft="@+id/user_password"
android:layout_alignStart="@+id/user_password"
android:textColor="#ffffff"
android:textSize="20dp" />
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView android:id="@+id/register_text"
android:text="登 录"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#EEB423"
android:textColorLink="#FF0066CC"
android:textSize="18dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="27dp"
android:layout_marginEnd="27dp" />
</RelativeLayout>
</LinearLayout>
(2)看不见的背景:background_login_div.xml
这个可以直接不要了,当初是参考了别人设计的一个,所以就暂时留着了,如果需要,请将这个xml文件建在./drawable文件夹下。
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#EFEFEF" />
<!-- 设置圆角
注意: bottomRightRadius是左下角而不是右下角 bottomLeftRadius右下角-->
<corners android:topLeftRadius="10dp" android:topRightRadius="10dp"
android:bottomRightRadius="10dp" android:bottomLeftRadius="10dp"/>
</shape>
2.RegisterActivity.java中为注册按钮增加点击监听事件
User是一个Bean,封装user信息
/**
* 注册按钮监听事件
*/
registerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//if((Boolean)result.get("phone")&&(Boolean)result.get("passwordl")&&(Boolean)result.get("passwordd"))
//{
userPhone = userPhoneText.getText().toString();
userName = userNameText.getText().toString();
userPassword = userPasswordText.getText().toString();
//userPasswordD = userPasswordTextD.getText().toString();
userIdCard = userIdCardText.getText().toString();
//UserModel user = new UserModel(UUID.randomUUID().toString(),userPhone, MD5.md5(userPassword),userName,1,"1991-06-28",userIdCard,"");
User user = new User();
user.setUserId(MyUUID.getUUID()); //id
user.setUserPhone(userPhone);
user.setUserPassword(MD5.md5(userPassword)); //md5加密
user.setUserGender(1); //暂时默认
user.setUserName(userName);
user.setUserBirthday("19910628"); //暂时默认
user.setUserIdCard(userIdCard);
user.setUserImage(""); //暂时为空
ConnectServer.userRegister(user);
// }
}
});
3.ConnectServer.userRegister(User user)
主要是开启一个新线程,访问服务器。
/**
* 用户注册
*/
public static boolean userRegister(final User user)
{
new Thread()
{
@Override
public void run()
{
try {
JSONObject userJSON = new JSONObject();
userJSON.put("userName",user.getUserName());
userJSON.put("userPhone",user.getUserPhone());
userJSON.put("userPassword",user.getUserPassword());
userJSON.put("userGender",user.getUserGender());
userJSON.put("userId",user.getUserId());
userJSON.put("userIdCard",user.getUserIdCard());
userJSON.put("userBirthday",user.getUserBirthday());
userJSON.put("userImage",user.getUserImage());
//JSONObject object = new JSONObject();
//object.put("user",userJSON);
String content = String.valueOf(userJSON);
//HttpURLConnection connection =
/**
* 请求地址
*/
String url = serverURL+"user/save";
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
//HttpURLConnection connection = (HttpURLConnection) nURL.openConnection();
connection.setConnectTimeout(5000);
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("User-Agent", "Fiddler");
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Charset", "UTF-8");
OutputStream os = connection.getOutputStream();
os.write(content.getBytes());
os.close();
/**
* 服务器返回结果
* 继续干什么事情....待续
*/
String result = read(connection.getInputStream());
Log.i("success","成功注册");
}catch (Exception e)
{
}
}
}.start();
return true;
}
4.服务器端
好吧,其实我主要问题就是在这里了。因为最开始的时候,是想把User直接封装到JSONObject中,然后再传递给服务器端,后来在服务器端始终不能解析出来user信息,最后还是直接使用JSONObject。
/**
* 添加user
*
* @param request
* 请求
* @param response
* 返回
* @return 操作结果
*/
@RequestMapping(value = "/user/save", method = RequestMethod.POST)
@ResponseBody
public void add(HttpServletRequest request, HttpServletResponse response) {
User user = new User();
try{
String streamIn = ReadStream.read(new BufferedInputStream(request.getInputStream()));
//JSONObject object = JSONObject.fromObject(streamIn).getJSONObject("user");
JSONObject object = JSONObject.fromObject(streamIn);
user.setUserName(object.getString("userName"));
user.setUserPhone(object.getString("userPhone"));
user.setUserPassword(object.getString("userPassword"));
user.setUserGender(object.getInt("userGender"));
user.setUserId(object.getString("userId"));
user.setUserIdCard(object.getString("userIdCard"));
user.setUserBirthday(object.getString("userBirthday"));
user.setUserImage(object.getString("userImage"));
/**
* DAO层,写入数据库
*/
boolean result = userDAO.add(user);
/**
* 给手机端返回的数据
*/
if(result)
response.getOutputStream().write("1".getBytes("UTF-8"));
else
response.getOutputStream().write("0".getBytes("UTF-8"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println( new String(bout.toByteArray(),"UTF-8"));
}
三.效果
Ok,最后该看看效果了,关于注册那块的信息验证暂时就不贴上来了,因为自己还没做完。
先是漂亮的界面~。~
然后是最终数据库中的数据,后面5条是新注册的测试数据。