从 Android 发送 JSON HTTP POST 请求
Posted
技术标签:
【中文标题】从 Android 发送 JSON HTTP POST 请求【英文标题】:Sending a JSON HTTP POST request from Android 【发布时间】:2012-12-04 10:06:12 【问题描述】:我正在使用下面的代码发送一个 http POST 请求,该请求将一个对象发送到 WCF 服务。这工作正常,但如果我的 WCF 服务还需要其他参数会怎样?如何从我的 android 客户端发送它们?
这是我目前写的代码:
StringBuilder sb = new StringBuilder();
String http = "http://android.schoolportal.gr/Service.svc/SaveValues";
HttpURLConnection urlConnection=null;
try
URL url = new URL(http);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setUseCaches(false);
urlConnection.setConnectTimeout(10000);
urlConnection.setReadTimeout(10000);
urlConnection.setRequestProperty("Content-Type","application/json");
urlConnection.setRequestProperty("Host", "android.schoolportal.gr");
urlConnection.connect();
//Create JSONObject here
JSONObject jsonParam = new JSONObject();
jsonParam.put("ID", "25");
jsonParam.put("description", "Real");
jsonParam.put("enable", "true");
OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
out.write(jsonParam.toString());
out.close();
int HttpResult =urlConnection.getResponseCode();
if(HttpResult ==HttpURLConnection.HTTP_OK)
BufferedReader br = new BufferedReader(new InputStreamReader(
urlConnection.getInputStream(),"utf-8"));
String line = null;
while ((line = br.readLine()) != null)
sb.append(line + "\n");
br.close();
System.out.println(""+sb.toString());
else
System.out.println(urlConnection.getResponseMessage());
catch (MalformedURLException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
catch (JSONException e)
// TODO Auto-generated catch block
e.printStackTrace();
finally
if(urlConnection!=null)
urlConnection.disconnect();
【问题讨论】:
点击此链接。您正在尝试发送其他参数,链接会向您展示如何在编码 xyzws.com/Javafaq/… 后发送它们 【参考方案1】:使用 POST 发布参数:-
URL url;
URLConnection urlConn;
DataOutputStream printout;
DataInputStream input;
url = new URL (getCodeBase().toString() + "env.tcgi");
urlConn = url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);
urlConn.setUseCaches (false);
urlConn.setRequestProperty("Content-Type","application/json");
urlConn.setRequestProperty("Host", "android.schoolportal.gr");
urlConn.connect();
//Create JSONObject here
JSONObject jsonParam = new JSONObject();
jsonParam.put("ID", "25");
jsonParam.put("description", "Real");
jsonParam.put("enable", "true");
你漏掉的部分在下面……即如下……
// Send POST output.
printout = new DataOutputStream(urlConn.getOutputStream ());
printout.writeBytes(URLEncoder.encode(jsonParam.toString(),"UTF-8"));
printout.flush ();
printout.close ();
剩下的事情你可以做。
【讨论】:
对不起,我接受了你的回答,但现在我正在尝试实现它,我遇到了问题。你在哪里传递你的参数? DataOutputStream类型中的write(int)方法不适用于参数(String) 而不是 write(int);我用 String str = jsonString.toString();字节[] 数据=str.getBytes("UTF-8"); printout.write(数据); printout.flush(); printout.close();它正在工作。 这是一个旧答案,但它对我来说非常有用,可以摆脱已弃用的 DefaultHttpClient。我还从已弃用的 NameValuePair 移至 JSON 对象。顺便说一句,我不得不将“write”更改为“writeBytes”。 我得到了上面解释的错误,printout.write() 的参数类型错误,所以我使用了 printout.writeUTF(URLEncoder.encode(params.toString(), "UTF-8")) ;【参考方案2】:尝试一些类似打击的事情:
SString otherParametersUrServiceNeed = "Company=acompany&Lng=test&MainPeriod=test&UserID=123&CourseDate=8:10:10";
String request = "http://android.schoolportal.gr/Service.svc/SaveValues";
URL url = new URL(request);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(otherParametersUrServiceNeed.getBytes().length));
connection.setUseCaches (false);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(otherParametersUrServiceNeed);
JSONObject jsonParam = new JSONObject();
jsonParam.put("ID", "25");
jsonParam.put("description", "Real");
jsonParam.put("enable", "true");
wr.writeBytes(jsonParam.toString());
wr.flush();
wr.close();
参考资料:
-
http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139
Java - sending HTTP parameters via POST method easily
【讨论】:
我做到了,但我仍然收到一个错误的请求作为服务器响应。现在让我问一下我是否做了所有正确的事情:当我设置其他参数时,我应该输入 param1 还是我的参数名称?另外,我的 json 对象是第一个参数,所以我先写这个,然后再写其他参数,对吗? 在服务器端,参数序列无关紧要。看来您将 json 放入有效负载中...在此otherParametersUrServiceNeed = "param1=a&param2=b&param3=c";
中输入您服务器需要的参数名称,这只是示例..您应该首先确定您的服务器在请求中需要添加这些参数以及String otherParametersUrService
中的值,如我的示例所示。
如果不是保密的,你可以告诉我你的服务器需要什么附加参数..这样我就可以把它们放在上面的例子中。
不是,我给你方法签名就可以了??:long InsertStudentAbsences(SRV_Students_Absence objStudentAbsences, string Company, string Lng, string MainPeriod, string UserID, string CourseDate);
你还需要别的吗??以上是关于从 Android 发送 JSON HTTP POST 请求的主要内容,如果未能解决你的问题,请参考以下文章