使用get和post方式提交数据

GET方式提交数据

Android中Http提交get请求,需要把要提交的数据拼接在url后面

服务器端:

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //拿到用户名
        String name =  request.getParameter("name");
        String pass =  request.getParameter("pass");

        System.out.println(name + ";" + pass);

        OutputStream os = response.getOutputStream();
        //验证是否正确,写死了
        if("asd".equals(name) && "123".equals(pass)){
            //服务器端与客户端编码一致,防止出现乱码
            os.write("登录成功".getBytes("utf-8"));
        }
        else{
            os.write("登录失败QAQ".getBytes("utf-8"));
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}

客户端:

    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            Toast.makeText(MainActivity.this, (String)msg.obj, 0).show();
        }
    };

    public void click(View v) {
        EditText et_name = (EditText) findViewById(R.id.et_name);
        EditText et_pass = (EditText) findViewById(R.id.et_pass);

        final String name = et_name.getText().toString();
        final String pass = et_pass.getText().toString();


        Thread t = new Thread(){
            //网址是拼在url后面,注意不要加空格,否则提交不过去
            String path = "http://10.66.121.5/WebGet/servlet/LoginServlet?name=" + name + "&pass=" + pass;

            @Override
            public void run() {
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    conn.setReadTimeout(5000);

                    if(conn.getResponseCode() == 200){
                        InputStream is = conn.getInputStream();
                        String text = Utils.getTextFrom(is);

                        Message msg = handler.obtainMessage();
                        msg.obj = text;

                        handler.sendMessage(msg);
                    }
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        };
        t.start();


    }
public class Utils {

    //创建专门从流里读数据的方法
    public static String getTextFrom(InputStream is){

        byte[] b = new byte[1024];
        int len = 0;
        //创建字节数组输出流,读取输入流的文本数据时,同步把数据写入数组输出流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            while((len = is.read(b)) != -1){
                bos.write(b, 0, len);
            }
            //把字节数组输出流里的数据转换成字节数组
            String text = new String(bos.toByteArray());
            return text;
        } catch (IOException e) {

            e.printStackTrace();
        }
        //try出问题了就什么都读不到
        return null;
    }
}

如果想要使用中文,则需要在服务器端修改编码,因为在服务器拿到字节数组时是用iso8859-1的码表把字节数组变成字符串的,浏览器是用utf-8把字节数组变成字符串,因此需要把name用iso8859-1的编码重新变成字节数组,再用utf-8的码表重新变成字符串,这时name就可以是一个中文了

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //拿到用户名
        String name =  request.getParameter("name");
        String pass =  request.getParameter("pass");

        name = new String(name.getBytes("iso8859-1"),"utf-8");
        pass = new String(pass.getBytes("iso8859-1"),"utf-8");

        System.out.println(name + ";" + pass);

        OutputStream os = response.getOutputStream();
        //验证是否正确,写死了
        if("一一".equals(name) && "123".equals(pass)){
            os.write("登录成功".getBytes("utf-8"));
        }
        else{
            os.write("登录失败QAQ".getBytes("utf-8"));
        }
    }
            //提交的数据需要经过url编码,英文和数字编码后不变,中文改变
            String path = "http://10.66.121.5/WebGet/servlet/LoginServlet?name=" + URLEncoder.encode(name) + "&pass=" + pass;

Post方式提交数据

Post方式数据不是拼接在url后面的,而是放在请求的流当中传过来的,通过流写给服务器,在响应头处多了两个属性的字段,Content-Type(内容的类型)和Centent-Length(提交数据的长度),使得服务器处理数据时更为方便

        Thread t = new Thread(){
            //Post提交就只是servlet网址,不用拼接字符串
            String path = "http://10.66.121.5/WebGet/servlet/LoginServlet";

            @Override
            public void run() {
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("POST");
                    conn.setConnectTimeout(5000);
                    conn.setReadTimeout(5000);

                    //拼接出要提交的数据的字符串
                    String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass;

                    //添加post请求多出的两行属性
                    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                    conn.setRequestProperty("Content-Length", data.length() + "");

                    //设置打开输出流,设置可用
                    conn.setDoOutput(true);
                    //拿到输出流
                    OutputStream os = conn.getOutputStream();
                    //使用输出流往服务器提交数据
                    os.write(data.getBytes());
                    if(conn.getResponseCode() == 200){
                        InputStream is = conn.getInputStream();
                        String text = Utils.getTextFrom(is);

                        Message msg = handler.obtainMessage();
                        msg.obj = text;

                        handler.sendMessage(msg);
                    }
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        };
        t.start();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值