在 HttpURLConnection 为啥 JSONObject as Params 不起作用但 String as Params 起作用
Posted
技术标签:
【中文标题】在 HttpURLConnection 为啥 JSONObject as Params 不起作用但 String as Params 起作用【英文标题】:In HttpURLConnection Why don't JSONObject as Params work but String as Params are working在 HttpURLConnection 为什么 JSONObject as Params 不起作用但 String as Params 起作用 【发布时间】:2015-07-31 04:00:12 【问题描述】:我正在使用 HttpUrlConnection 将一些数据发布到我的服务器这里是函数:
private String register(String myurl) throws IOException
String resp = null;
try
JSONObject parameters = new JSONObject();
// parameters.put("jsonArray", ((makeJSON())));
parameters.put("key", "key");//getencryptkey());
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// conn.setReadTimeout(10000 /* milliseconds *///);
// conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
OutputStream out = new BufferedOutputStream(conn.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
writer.write(parameters.toString());
writer.close();
out.close();
int responseCode = conn.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null)
response.append(inputLine);
in.close();
System.out.println("strngbuffr" + response.toString());
resp = response.toString();
catch (Exception exception)
System.out.println("Exception: " + exception);
System.out.println("rsp"+ resp.toString());
return resp.toString();
我得到的响应代码为 200,这意味着连接正常,但是我在 php 端得到空变量,这里有什么问题?
之前我也发送了一个 JSON 数组,但只是为了测试功能性,我评论说现在我只发送一个变量 key as "key"
令人惊讶的是,这个示例代码有效 - 没有 JSON 数组和键值对:
private String sendPost(String url) throws Exception
String USER_AGENT = "Mozilla/5.0";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//add reuqest header
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
String urlParameters ="sn=C02G8416DRJM&cn=&locale=&caller=&num=12345";
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + urlParameters);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null)
response.append(inputLine);
in.close();
//print result
System.out.println("rvsp"+response.toString());
return response.toString();
所以归结为替换这个:
JSONObject parameters = new JSONObject();
parameters.put("jsonArray", new JSONArray(Arrays.asList(makeJSON())));
parameters.put("key", getencryptkey());
通过这个:
String urlParameters ="jArr="+makeJSON()+"Key="+getencryptkey();
我仍然很好奇。
【问题讨论】:
使用jersey
(在你的情况下为jersey-client
)来处理这些东西。 jersey.java.net
我全心全意地接受您的解决方案,但是上面有什么问题。 HttpURLConnection 作为 android 设定的事实标准不应该是这样的。
这不能回答问题,但我可以建议你使用 apache httpclient 吗?几行代码就可以做到这一点
我完全同意你的建议,但 HttpURLCONnection 已被 Android 强制作为事实上的标准。
【参考方案1】:
这里的问题不在于 Java 端,而在于 php 端,如果在 php 端以这种方式收集 JSON Object as POST params 方法将起作用:
<?php
$json = file_get_contents('php://input');
$obj = json_decode($json);
print_r($obj);
print_r("this is a test");
?>
【讨论】:
【参考方案2】:我认为这里的问题不在于 Java 端,如果参数是固定类型,如在你的情况下为 json,那么如果在 php 端以这种方式收集,JSON Object as POST params 方法将起作用:
<?php
$json = file_get_contents('php://input');
$obj = json_decode($json);
print_r($obj);
print_r("this is a test response");
?>
【讨论】:
以上是关于在 HttpURLConnection 为啥 JSONObject as Params 不起作用但 String as Params 起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Android 的 HttpUrlConnection 不支持 HTTP/2?
为啥 ConnectException:连接被拒绝:从 HttpURLConnection.getResponseCode() 抛出连接? [复制]
为啥android HttpURLConnection 缓存输入流结果?