从 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 请求的主要内容,如果未能解决你的问题,请参考以下文章

通过 JSON 将数据从 android 发送到服务器

如何使用 doGet 方法捕获从 android 应用程序发送到 servlet 的 JSON 对象?

将json对象发送到android中的HTTP服务器

Android 手机卫士--构建服务端json请求网络数据

从 Android 向 Laravel 发送 JSON

如何将json从android发送到php?