Android开发:客户端与服务器通过传递和接收json数据进行交互 - Go语言中文社区

Android开发:客户端与服务器通过传递和接收json数据进行交互


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条是新注册的测试数据。



版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chentravelling/article/details/51075560
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-06 09:49:32
  • 阅读 ( 975 )
  • 分类:前端

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢