从头学android_GET 和 POST 网络请求

原创 2016年05月30日 23:24:22

表单请求

Post和get请求作为Http请求的两种方式,不管是在web中,还是android中,都是相同的。get请求直接将参数拼接在url后面,post请求将参数作为响应体发送,二者对中文参数都是经过url编码后传输。

get请求

                String path = "http://172.20.12.131:8080/web001/LoginServlet?username=" + URLEncoder.encode(username) + "&password=" + password;
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setReadTimeout(8000);
                    conn.setConnectTimeout(8000);
                    if (conn.getResponseCode() == 200) {
                        InputStream is = conn.getInputStream();
                        String result = getStringFromInputStream(is);

                        Message msg = new Message();
                        msg.obj = result;
                        handler.sendMessage(msg);
                    }
其中
URLEncoder.encode(username)
是一个过时方法,被建议使用的是
URLEncoder.encode(String text,String charSet)

通过查看源码发现

public static String encode(String s) {
        return ENCODER.encode(s, StandardCharsets.UTF_8);
    }

可见,这个方法虽然过时,但是只是对不过时方法的一次调用,并且直接使用了UTF-8,所以,就应该用这个过时方法。

post请求

                String path = "http://172.20.12.131:8080/web001/LoginServlet";
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("POST");
                    conn.setConnectTimeout(8000);
                    conn.setReadTimeout(8000);
                    //拼接响应体内容
                    String content = "username="+URLEncoder.encode(username)+"&password="+URLEncoder.encode(password);
                    conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");//自行设置Content-Type
                    conn.setRequestProperty("Content-Length",content.length()+"");//自行设置Content-Length

                    conn.setDoOutput(true);//必须设置,标志这个请求要写入内容
                    OutputStream out = conn.getOutputStream();
                    out.write(content.getBytes());
                    out.close();
                    if (conn.getResponseCode() == 200) {
                        InputStream is = conn.getInputStream();
                        String result = getStringFromInputStream(is);
                        Message msg = new Message();
                        msg.obj = result;
                        handler.sendMessage(msg);
                    }
                }


与get不同,post有两个请求头需要自己设置,内容需要用输出流写入。

中文乱码问题:

核心思想是,能选的地方都设置为UTF-8,不能选却要用的地方先用原字符集得到字节流,再用UTF-8 new出新字符串使用。

服务器端乱码处理

		/*
		 * get请求的乱码
		 */
		public void doGet(HttpServletRequest request, HttpServletResponse response)
				throws ServletException, IOException {
			
			// 得到乱码
			String name = request.getParameter("username");
			// 转换编码
			name = new String(name.getBytes("iso-8859-1"), "utf-8");//可以解决!
			System.out.println(name);
			
			// 响应乱码
			response.setContentType("text/html;charset=utf-8");// 可以解决!
			response.getWriter().write("张三");
		}
	 
		/*
		 * post请求乱码
		 */
		public void doPost(HttpServletRequest request, HttpServletResponse response)
				throws ServletException, IOException {
	 
			// 请求乱码
			request.setCharacterEncoding("utf-8");// 可以解决
			String name = request.getParameter("username");
			System.out.println(name);
	 
			// 响应乱码
			response.setContentType("text/html;charset=utf-8");// 可以解决!!
			response.getWriter().write("李四");
}

客户端乱码处理

1.对于参数要用url编码封装,

2.对于响应流中的数据,用utf-8接收

String(bos.toByteArray(), "utf-8")

总结

这种原始的请求方式虽然在开发中不见得有多么常用,但是理解它的整个过程对使用其他快捷方法有很大的帮助。



版权声明:本文为Mr.Seng原创文章,转载注明地址:http://blog.csdn.net/mr_seng

相关文章推荐

Android中的Https网络请求get和post 不进行认证

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)是通过证书认证、数据加密打造的一条安全的HTTP通道,也就是安全版HTTP...

Android-封装post和get 网络请求

1.背景    在开发android 的时候,网络请求时必不可少的,在此,封装成一个类,方便调用; 2.注意    在这里实现了 HttpUrlConnection (不是HttpsUr...

Android 网络请求通用的get与post方式

在我们开发项目时,经常会涉及到网络交互这一块,很多时候都是多人同时开发一个项目。因此一个好的架构师,通常会在搭建框架时,会构建一个统一的IO工具类,进行网络交互,这样便于统一管理。如果每个人写一套自己...
  • hap_gx
  • hap_gx
  • 2013-10-10 17:09
  • 1466

Android okHttp 实战(一):okHttp网络请求之Get/Post请求

原文地址:http://www.cnblogs.com/whoislcj/p/5526431.html  okHttp、volley、android-async-http对比: volle...

Android okHttp网络请求之Get/Post请求

转自原版http://www.cnblogs.com/whoislcj/p/5526431.html
  • zlwzm
  • zlwzm
  • 2016-10-13 10:24
  • 94

Android 网络请求方式之HttpClient,GET,POST,PUT请求使用方法

HttpClient是Apache开源组织提供的HTTP网络访问接口,HttpClient封装了访问http的请求头,参数,内容体,响应等等,有很多API,可以很方便的处理session,cookie...

Android网络请求开源框架Volley快速使用指南(1)——发起Get和Post请求

1.下载编译好的jar包 http://download.csdn.net/detail/u012027644/8547825 2.get请求 RequestQueue mQueue = Volley...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)