美文网首页
再用HttpUrlConnection:解决服务器接收POST的

再用HttpUrlConnection:解决服务器接收POST的

作者: uid_77268337826 | 来源:发表于2017-10-02 20:41 被阅读0次

    *服务器配置为Windows+Apache+PHP

    在上次用HUC(HttpUrlConnection,名字太长用简称,下同)时,只实现了GET方法,POST方法因为收不到参数所以搁置下来。但是后面做一个项目只能用POST不能用GET,GET会直接暴露参数以及格式,传递相对重要的数据时不能用GET(例如涉及账号登录验证等操作),所以不得不拾起POST继续搞一搞XD

            String params="name=123&age=456";
            try {
                byte[] data=params.toString().getBytes();
                URL urls=new URL(url);
                HttpURLConnection conn=(HttpURLConnection) urls.openConnection();
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestProperty("Content-Length", String.valueOf(data.length));
                conn.setReadTimeout(4000);
                conn.connect();
                OutputStream pw=conn.getOutputStream();
                pw.write(data);
                BufferedReader bfread=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String str;
                StringBuffer resb=new StringBuffer();
                while ((str=bfread.readLine())!=null)
                {
                    resb.append(str);
                }
                Glo.getres=resb.toString()+" code:"+conn.getResponseCode();
            } catch (MalformedURLException e) {
                e.printStackTrace();
                Glo.getres="{'error':'101'}";
            } catch (IOException e) {
                e.printStackTrace();
                Glo.getres="{'error':'201'}";
            }
    

    上次写POST的时候主要时卡在接收参数的地方,PHP服务端收到请求后判断有没有POST内容,如果有就输出内容没有就输出“没有收到POST参数”,客户端获取结果后,将结果显示在屏幕上。结果一直显示“没有收到POST参数”,说明能连上,服务端的代码没有问题。而客户端在借鉴了CSDN以及各种网站的代码之后,仍然没有成功。在Stackoverflow提问之后根据回答尝试修改代码,依然没有成功。

    这时我用了站长之家的在线POST测试工具,发现工具也没法用POST传递数据,http状态码为200但是仍然没有数据:

    POST测试工具.png

    之后被CSDN带歪了,以为是跨域的问题(后来想了想跨域一般在C/S架构里才可能遇到,别入坑)改来改去依然如此,但是明确了一点就是服务器这边肯定是有问题的,端口屏蔽,Apache访问控制等等都想过一遍了,最后干脆在另一个服务器上测试,结果发现另一个服务器POST通过了!这时候发现了问题:在另一个服务器上PHP文件布置在根目录,而原来的布置在二级目录"java"下面,名字为index.php,URL是 www.域名.com/java。使用GET方法时URL+参数在访问之前已经组装完毕,所以Apache会定向到目录下面的默认文件名index.php。而POST方法连接时与GET相同,Apache会自动定向到默认文件index.php,但是发送http请求时因为URL只到目录,所是向服务器根目录下一个名叫"java"的文件POST数据,实际能接收处理数据的是"java"文件夹下的index.php,所以会出现连接成功但是没有收到参数的情况。

    所以在写POST的时候,服务端的URL必须要写全路径,就算已经在Apache服务器那边指定了默认文件!

    相关文章

      网友评论

          本文标题:再用HttpUrlConnection:解决服务器接收POST的

          本文链接:https://www.haomeiwen.com/subject/fdmtyxtx.html