先耐心看我是怎么一步一步发现问题的。国庆节我打算把Android网路互联这一块儿学完。盯着某网站视频写代码,这是某网站视频截图如下:
她正在写Android客户端的一个demo,需要实现登录验证功能。截图中可以看到:她写的
conn.setDoOutput(true);
然后写了
conn.setRequestMethod("GET");
就是说用的是GET请求。
因为以前只要跟着视频一起敲,最后的结果一定和她的一致。所以我对这个网站的视频质量从没怀疑过。
我跟着上面的敲完,然后自己在javaEE-Eclipse上搭建tomcat服务器。
视频上的效果是:如果用户名为“zhangsan”并且密码为“123”,服务器就会返回“OK”,否则返回“ERROR”,我并不会搭建服务器,只能一点一点地找资料慢慢学,从servlet开始了解,了解URL,了解doGET方法,了解怎么接受并识别数据,终于,最后在浏览器地址栏输入URL后,服务器有了响应。
我以为大功告成,没想到自己的app点击登录按钮时,并没有接受到服务器返回的数据,我对着logcat看了半天,把错误复制粘贴到百度甚至是Google上去求助,没有相关的详细解释。搞了好几个小时,最终我看到视频截图中的那一行代码:
conn.getResponseCode()==200
心想到底什么意思?
我百度到这篇文章:知乎:http返回码200的含义,惊讶了,原来还有常说的404,30x,我试着把自己的程序里面的getResponseCode()输出,结果是405,代表着我使用了禁止的访问方式。我再次百度,想看看怎么解决这个405 错误,但是很遗憾没有可行的解决方式。点击登录按钮,服务器仍旧一点反应都没有。
折腾了好长时间,我都想放弃了,真的感觉自己尽力了,没办法了,本来打算把网络互连学完,就去补java,现在看来得提前结束Android之旅了。下午早早回寝室,感觉彻底解脱了。
在寝室里我边打游戏,边想那个405错误到底是怎么回事,心里还是放不下。第二天一大早,我习惯性地背起书包,再回创新实验室。
没什么好办法,只能暂时放弃视频,到网上去找其他大神的demo。费尽心血,沙里淘金找到了可靠的代码,重新建服务器,写Android布局,改URL。一番折腾,终于在10月4号的晚上,成功了。网址如下:
这时,我终于忍不住去反思,视频里的代码,到底哪里出错了?那个405错误到底是为什么?看截图如下:
大家可以清楚地看到在我的新project中,我写的setDoOutput(false),运行结果是右边的“login success”。这和视频里的代码截然相反,那么这个神秘的setDoOutput到底是什么鬼?
我简要说明:
setDoInput(true),是指客户端(就是我们的app)接受服务器的输入(就是服务的返回值),这个必须为true,因为所有的网络请求都需要接受服务器的响应,不管是get方式,还是POST方式。
setDoOutput()是true还是false,可就是另外一回事了,setDoOutput是指客户端是否需要向服务器发送数据,这里我们为什么要设置成false了?
其实,我们的url只是网络请求的头部,还可以携带body,这就是POST和GET的区别了。这就意味着客户端要向服务器端输出,所以是Output。现在我们设置setDoOutput(false),就好理解了。我们不需要传请求体(body),就设为false。具体看这个网址吧:csdn:HttpUrlConnection的setDoOutput与setDoInput的区别。
那405又是怎么回事了?这篇博客讲的蛮清楚:
用HttpURLConnection复现http响应码405,解释405,感兴趣可以看看。
我没有把这个视频网站的网址贴出来,是因为他们毕竟让我免费学习了很多android知识,这个过程让我更深刻的理解了服务器,servlet,汉字乱码,http状态码等等,也希望那些做视频的机构,能够对视频质量负责。
----------------2019年5月6日补充:欢迎小白加入qq群:704369440---------------