我目前正在尝试使用HttpURLConnection类通过Android应用程序将POST方法发送到简单的PHP Web服务。多个教程使用缓冲的writer类将params写入http-body,但HttpURLConnection也有一个setRequestProperty()方法,它为连接添加一个键值对。显然它们不是用于同一目的,但有什么区别(我也检查了谷歌,但没有找到答案)?
答案 0 :(得分:3)
setRequestProperty()
用于设置HTTP标头(如Content-Type
):
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
但是要设置POST参数,您需要对它们进行url编码,并将结果字符串(转换为字节流)写入从OutputStream
实例获取的HttpURLConnection
。
例如,要将值a
的{{1}}和值1
的{{1}}作为POST参数发送,您可以执行以下操作:
b
此处,2
是final String urlEncodedString = "a=1&b=2";
final byte[] bytesToWrite = urlEncodedString.getBytes(StandardCharsets.UTF_8);
conn.getOutputStream().write(bytesToWrite);
的实例。
答案 1 :(得分:1)
您使用过于旧的方式向服务器发出请求。 尝试使用一些库,这将减少许多不必要的代码,如加载缓冲读取器和转换过程,而我建议你使用齐射库,请阅读有关它的谷歌文档。 您可以创建自定义JSONObjectReuqest并覆盖getParams方法,也可以在构造函数中将它们作为JSONObject提供到请求的主体中。
像这样(我编辑了你的代码):
JSONObject obj = new JSONObject();
obj.put("key", "value");
obj.put("key2", "value2");
// add whatever you want
RequestQueue queue = MyVolley.getRequestQueue();
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,obj,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println(response);
hideProgressDialog();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
hideProgressDialog();
}
});
queue.add(jsObjRequest);
&#13;