*服务器配置为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服务器那边指定了默认文件!
网友评论