Android传统HTTP请求get----post方式提交数据(包括乱码问题)

1.模仿登入页面显示(使用传统方式是面向过程的)

使用Apache公司提供的HttpClient  API是面向对象的

(文章底部含有源码的连接,包括了使用async框架)

(解决中文乱码的问题。主要是对中文的数据进行URL编码)

android手机默认的编码是UTF-8

2.手机截图Demo

3.server截图

代码例如以下:

server端的代码:

//測试 android设备登入
public class Login extends HttpServlet {

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

		String username = request.getParameter("username");
		String password = request.getParameter("password");

		//对数据进行编码,解决乱码问题
		username  = new String(username.getBytes("ISO-8859-1"),"UTF-8");
		System.out.println("username--:"+username+"---password:"+password);

		if(username.equals("admin") && password.equals("123")){
			response.getOutputStream().write("登入成功".getBytes("UTF-8"));
		}else{
			response.getOutputStream().write("登入失败".getBytes("UTF-8"));
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//		request.setCharacterEncoding("UTF-8");
		doGet(request, response);

	}

}

Androidclient

布局文件的部分:

//測试 android设备登入
public class Login extends HttpServlet {

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

		String username = request.getParameter("username");
		String password = request.getParameter("password");

		//对数据进行编码,解决乱码问题
		username  = new String(username.getBytes("ISO-8859-1"),"UTF-8");
		System.out.println("username--:"+username+"---password:"+password);

		if(username.equals("admin") && password.equals("123")){
			response.getOutputStream().write("登入成功".getBytes("UTF-8"));
		}else{
			response.getOutputStream().write("登入失败".getBytes("UTF-8"));
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//		request.setCharacterEncoding("UTF-8");
		doGet(request, response);

	}

}

Activity代码部分:

(注意:android4.0之后訪问网络必须开子线程进行訪问,而且涉及到权限。记得加上訪问网络的权限

以下的代码中,我写入get和post两种方式的线程请求。。

。。。。。

。。。

。。。慢慢体会

public class MainActivity extends AppCompatActivity {
    private static final int SUCCESS = 0;
    private static final int FAILE = 1;
    private static final int NET_ERROR = 3;
    private static final String TAG = "MainActivity";
    EditText et_username;
    EditText et_password;
    TextView show_result;
    String username;
    String password;

    final String path = "http://188.188.7.85/Android_Server/Login";

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int what = msg.what;

            switch (what) {
                case SUCCESS:
                    String data = (String) msg.obj;
                    show_result.setText(data);
                    break;
                case FAILE:
                    Toast.makeText(MainActivity.this, "连接server失败", Toast.LENGTH_SHORT).show();
                    break;
                case NET_ERROR:
                    Toast.makeText(MainActivity.this, "网络出现异常", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_username = (EditText) findViewById(R.id.et_username);
        et_password = (EditText) findViewById(R.id.et_password);
        show_result = (TextView) findViewById(R.id.show_result);

        username = et_username.getText().toString().trim();
        password = et_password.getText().toString().trim();
    }

    public void login(View view) {
        username = et_username.getText().toString().trim();
        password = et_password.getText().toString().trim();

        if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
            Toast.makeText(this, "username与password不能为空", Toast.LENGTH_SHORT).show();
            return;
        }

        //使用传统get方式的请求server
//        new Thread_get().start();

        //使用传统的post方式请求server
        new Thread_post().start();

    }

    //传统的post方式请求server端
    class Thread_post extends Thread {
        @Override
        public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                //1.设置请求方式
                conn.setRequestMethod("POST");
                conn.setConnectTimeout(5000); //设置连接的超时事件是5秒

                //2.组合数据,一定要将数据进行URL编码
                String commitData = "username="+URLEncoder.encode(username,"UTF-8")+"&password="+URLEncoder.encode(password,"UTF-8");

                // 3. 指定content-type -实际上就是指定传输的数据类型
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

                //4.指定content-length Content-Length: 数据的长度
                conn.setRequestProperty("Content-Length", commitData.length() + "");

                //5.打开输出流。告诉server,我要写数据了
                conn.setDoOutput(true);

                //6.開始写数据
                OutputStream os = conn.getOutputStream();
                os.write(commitData.getBytes());
//                os.close();

                int code = conn.getResponseCode();  //获取返回的成功代码
                Log.i(TAG, "code:---" + code);

                if (code == 200) {
                    //表示连接server成功返回信息
                    String data = ServerTools.getInfo(conn.getInputStream());

                    Log.i(TAG, "data:---" + data);
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = SUCCESS;
                    ms.obj = data;
                    handler.sendMessage(ms);
                } else {
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = FAILE;
                    handler.sendMessage(ms);
                }

            } catch (Exception e) {

                //使用消息处理机制,将数据传递给主线程
                Message ms = new Message();
                ms.what = NET_ERROR;
                handler.sendMessage(ms);
                e.printStackTrace();
            }
        }
    }

    //传统的get方式请求server端
    class Thread_get extends Thread {
        @Override
        public void run() {
            try {
                String getPath = path +
                        "?username=" + URLEncoder.encode(username, "UTF-8") +
                        "&password=" + URLEncoder.encode(password, "UTF-8");
                URL url = new URL(getPath);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5000); //设置连接的超时事件是5秒
                int code = conn.getResponseCode();  //获取返回的成功代码

                Log.i(TAG, "code:---" + code);
                ;

                if (code == 200) {
                    //表示连接server成功返回信息
                    String data = ServerTools.getInfo(conn.getInputStream());

                    Log.i(TAG, "data:---" + data);
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = SUCCESS;
                    ms.obj = data;
                    handler.sendMessage(ms);
                } else {
                    //使用消息处理机制,将数据传递给主线程
                    Message ms = new Message();
                    ms.what = FAILE;
                    handler.sendMessage(ms);
                }

            } catch (Exception e) {

                //使用消息处理机制,将数据传递给主线程
                Message ms = new Message();
                ms.what = NET_ERROR;
                handler.sendMessage(ms);
                e.printStackTrace();
            }
        }
    }

}

工具类:

public class ServerTools {

    //从服务端获取流数据进行转化成文本文件
    public static String getInfo(InputStream in) {

        //将数据流写在内存中
        ByteArrayOutputStream raf = new ByteArrayOutputStream();
        String data = null;

        try{
            byte[] bt = new byte[1024];
            int len =0 ;
            while((len = in.read(bt)) != -1){
                raf.write(bt,0,len);
            }

           data = raf.toString();
        }catch (Exception e){
            e.printStackTrace();
        }

        return data;
    }
}

Android的源码已经放在github中:

传统方式Demo地址:https://github.com/momxmo/HTTP_get_post

Apache提供的HttpClient API面向对象的方式Demo:https://github.com/momxmo/HttpClient_get_post

使用async-http-master流行框架进行http请求:https://github.com/momxmo/Http_android-async-http-master_Demo

??

??

时间: 2024-07-31 07:11:37

Android传统HTTP请求get----post方式提交数据(包括乱码问题)的相关文章

Android传统HTTP请求get----post方式提交数据(包含乱码问题)

1.模仿登入页面显示(使用传统方式是面向过程的) 使用Apache公司提供的HttpClient  API是面向对象的 (解决中文乱码的问题,主要是对中文的数据进行URL编码) android手机默认的编码是UTF-8 2.手机截图Demo 3.服务器截图 代码如下: 服务器端的代码: //测试 android设备登入 public class Login extends HttpServlet { public void doGet(HttpServletRequest request, Ht

Android 如何用HttpClient 以Post方式提交数据并添加http头信息

转自:http://www.linuxidc.com/Linux/2011-09/42772.htm Android 如何 post json格式的数据,并附加http头,接受返回数据,请看下面的代码: 1 private void HttpPostData() { 2 try { 3 HttpClient httpclient = new DefaultHttpClient(); 4 String uri = "http://www.yourweb.com"; 5 HttpPost

Android 采用post方式提交数据到服务器

接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="m

Android 使用Post方式提交数据(登录)

在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器.POST与GET的不同之处在于POST的参数不是放在URL字符串里面,而是放在HTTP请求数据中. 本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并

Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)

1.前面提到Http的get/post方式  . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善开源框架,已经包装好了http的get/post,还有httpclient等等:这样我们开发周期也会缩短: 3.下面通过一个Android案例来进行,说明常用的Http框架:  在http://github.com/中搜索async http: 这里发现明显第1个android-async-http

Android学习之Http使用Post方式进行数据提交

转自:http://blog.csdn.net/wulianghuan/article/details/8626551 我们知道通过Get方式提交的数据是作为Url地址的一部分进行提交,而且对字节数的长度也有限制,与Get方式类似,http-post参数也是被URL编码的,然而它的变量名和变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送. 可以通过如下的代码设置POST提交方式参数: [html] view plaincopyprint? HttpURLConnecti

JQuery以JSON方式提交数据到服务端

JQuery将Ajax数据请求进行了封装,从而使得该操作实现起来容易许多.以往我们要写很多的代码来实现该功能,现在只需要调用$.ajax()方法,并指明请求的方式.地址.数据类型,以及回调方法等.下面的代码演示了如何将客户端表单数据封装成JSON格式,然后通过JQuery的Ajax请求将数据发送到服务端,并最终将数据存储到数据库中.服务端定义为一个.ashx文件,事实上你可以将服务端定义为任何能接收并处理客户端数据的类型,如Web Service,ASP.NET Page,Handler等. 首

苹果微信浏览器不能post方式提交数据问题

form表单中采用post方式提交数据时,在苹果的微信浏览器中无法传递,安卓的可以 如图: 在controller中获取该数据为 null 将表单的提交方式修改为get就能够获取到 现在采用Ajax方式进行提交

form提交数据中文乱码问题总结

一:form在前台以post方式提交数据: 浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器就以哪个码表提交数据.数据到达服务器后,数据(98 99)要封装到request中,在servlet中调用Request的getParameter方法返回的是字符串(“中国”),方法内部拿到数字后要转成字符,一定要查码表,由于request的设计者是外国人,所以默认查的是他们常用的ISO8859-1,这就是