关闭

从头学android_GET 和 POST 网络请求

标签: android编码urlwebstring
150人阅读 评论(0) 收藏 举报
分类:

表单请求

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")

总结

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



0
0
查看评论

[从头学数学] 第211节 带着计算机去高考(三)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼。设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉。 正剧开始: 星历2016年05月18日 1...
  • mwsister
  • mwsister
  • 2016-05-18 15:27
  • 2816

[从头学数学] 第160节 相似

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了筑基后期的修炼, 这次要修炼的目标是[相似]。 正剧开始: 星历2016年04月04日 09:54:11, 银河系厄尔斯星球中华帝国江南行省。 [工程师阿伟]正在和[机器小伟]一起研究[相似]。 ...
  • mwsister
  • mwsister
  • 2016-04-04 10:15
  • 692

从头学习JAVA(一)

JAVA语言概述Java分为J2EE,J2ME,J2SE J2ME:主要用于控制移动设备和信息家电等有限存储设别。 J2SE:整个JAVA技术的核心和基础,它是J2ME和J2EE编程的基础。 J2EE:提供了企业应用开发的相关的完整解决方案。JDK1.2 把 API分成三大类 核心API:由...
  • u010542146
  • u010542146
  • 2016-03-31 09:06
  • 254

从头开始学习算法和数据结构

#include #define N  (10) #define SUCCESS 0 #define FAULSE  -1 typedef int Elem; /*Function  prototype*/ int InsetSort(Elem ...
  • daiyinglang
  • daiyinglang
  • 2015-08-03 23:18
  • 173

从头开始学习angular.js----001(尽量每天一篇)

angularjs实现helloworld(双向绑定)1.首先介绍一下angular是个什么东西(题主也刚看的) angularjs是一个很不错的前端框架,喜欢前端的朋友可以跟我一起做 angular通过指令 扩展了HTML,然后通过表达式绑定数据到HTML2.首先在头部标签引入angular(...
  • u014271180
  • u014271180
  • 2016-10-22 18:23
  • 538

[从头学数学] 第227节 数学分析、高等数学、微积分的异同

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了元婴期的修炼。 这次要修炼的是数学分析(或称高等数学、或称微积分)。 正剧开始: 星历2016年05月28日 10:47:28, 银河系厄尔斯星球中华帝国江南行省。 [工程师阿伟]正在和[机器小伟]一起研究[数学分析、高等数学、...
  • mwsister
  • mwsister
  • 2016-05-28 11:24
  • 793

从头开始学算法

目录1.打印菱形2.递归实现阶乘计算3.递归实现回文判断    1.打印菱形分析:充分利用数学知识,坐标加函数,菱形的四条边看成4个一次函数,满足的情况打*,不满住的打空白程序:java 输入奇数import java.util.Scanner;public ...
  • abrody1983
  • abrody1983
  • 2011-06-30 23:26
  • 142

数学!!

数学!!! 目录 数学 目录 总览 模 模的基本性质 余 辗转相除 同余 逆元 杨辉三角 推广 卡特兰数 推广 斐波那契数列 推广 组合数 数学定理 gcd 一些数学相关的题 (本博客部分内容摘自百度百科,维基百科和大佬们的博客) 时不时积...
  • qq_35757800
  • qq_35757800
  • 2017-10-24 16:02
  • 119

[从头学数学] 第237节 重积分

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了元婴期的修炼。 这次要修炼的是数学分析(或称高等数学、或称微积分)。 正剧开始: 星历2016年06月03日 12:46:30, 银河系厄尔斯星球中华帝国江南行省。 [工程师阿伟]正在和[机器小伟]一起研究[重积分]。
  • mwsister
  • mwsister
  • 2016-06-03 13:36
  • 1674

[从头学数学] 第177节 三角函数

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹中期的修炼, 这次要修炼的目标是[三角函数]。 正剧开始: 星历2016年04月14日 10:26:31, 银河系厄尔斯星球中华帝国江南行省。 [工程师阿伟]正在和[机器小伟]一起研究[三角函数]。 ...
  • mwsister
  • mwsister
  • 2016-04-14 13:05
  • 1037
    个人资料
    • 访问:16743次
    • 积分:605
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条