android网络连接使用GET方式请求服务器时的setDoOutput(true)惹的祸

先耐心看我是怎么一步一步发现问题的,国庆节我打算把Android网路互联搞完。然后盯着视频写代码,这是某网站视频截图如下:

android网络连接使用GET方式请求服务器时的setDoOutput(true)惹的祸_第1张图片

她正在写Android客户端的一个访问demo,实现登录验证功能。而且是用GET方式访问,截图中可以看到:她写的conn.setOnOutput(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号的晚上,成功了。网址如下:

csdn大神:采用HttpURLConnection
     这时,我终于忍不住去反思,视频里的代码,到底哪里出错了?那个405错误到底是为什么?看截图如下:
 

 

android网络连接使用GET方式请求服务器时的setDoOutput(true)惹的祸_第2张图片

大家可以清楚地看到在我的新project中,我写的setDoOutput(faule),运行结果是右边的“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的区别。

    我没有把这个视频网站的网址贴出来,是因为他们毕竟让我免费学习了很多android知识,这个过程让我更深刻的理解了服务器,servlet,汉字乱码,http状态码等等,也希望那些做视频的机构,能够对视频质量负责。

----------------2019年5月6日补充:欢迎小白加入qq群:704369440---------------

你可能感兴趣的:(Android技术积累)