Android / Loopj - 我如何 POST 一个复杂的 JSON 对象到服务器?

Android / Loopj - How can i POST a complex JSON object to a server?

在我使用 Loopj 库的一个应用程序中,我需要将一个复杂的对象发送到 Web 服务(运行 on PHP)。我决定使用 Loppj 示例通过 HTTP POST 请求发送一个 JSON 对象。

JSONObject params = new JSONObject();

try
{
    params.put("params1", "value1");
    params.put("params2", "value2");
    params.put("params3", "value3");
}
catch(JSONException e)
{
    // ...
}

StringEntity entity = new StringEntity(params.toString(), HTTP.UTF_8);

ArrayList<Header> array = new ArrayList<>();
array.add(new BasicHeader("Content-type", "application/json"));
array.add(new BasicHeader("Accept", "application/json"));
Header[] headers = new Header[headers.size()];
headers = headers.toArray(array);

AsyncHttpClient client = new AsyncHttpClient();

client.post(context, url, headers, entity, "application/json", new JsonHttpResponseHandler()
{
    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONObject response)
    {
        //...       
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, Throwable e, JSONObject errorResponse)
    {
        // ...
    }
});

不幸的是,$_POST / $_REQUEST 总是空的。我搜索了不同的提示,但其中 none 个有效。我在我的网络服务中没有限制路由,只是一个简单的函数来转储发布的参数。

编辑 1

为了检查发布的参数,我编写了一个简单的 PHP 页面来记录它们。感谢@Steve,我能够在 php://input.

中找到它们
file_put_contents(__DIR__ . '/post_data.log', json_encode($_POST));
file_put_contents(__DIR__ . '/input_data.log', file_get_contents('php://input'));

事实是我不是最终网络服务的所有者,所以我无法更改对数据的访问。它们必须可以通过 $_POST 访问。那么,发送 application/json 不是解决方案吗? AJAX 如何将复杂对象发送到服务器并在 $_POST 而不是 Android 中找到它们?

编辑 2

我尝试用 PostMan 做同样的事情,但 $_POST 总是空的。因此,我分析了 jQuery.ajax(...) 发送的请求(允许您发送 JSON 对象)并从 JSON 对象生成正确的 key/value。

例如,JSON对象:

{
    "users":[
        {
            "name":"jean",
            "age":"25",
            "city":"paris"
        }
    ]
}

转换成3对 key/value :

所以,我想我需要一个将我的 JSON 对象转换为 RequestParams 对象并通过 "x-www-form-urlencoded" 发送它的函数。我不知道是否有任何本机函数可以执行此操作,但我发现 Javascript 等价物 (Query-string encoding of a Javascript Object).

serialize = function(obj, prefix) {
  var str = [], p;
  for(p in obj) {
    if (obj.hasOwnProperty(p)) {
      var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
      str.push((v !== null && typeof v === "object") ?
        serialize(v, k) :
        encodeURIComponent(k) + "=" + encodeURIComponent(v));
    }
  }
  return str.join("&");
}

正如我之前所说,我写了一个帮助程序 class,它将 JSONObject 转换为 RequestParams,后者可以 "normally" 通过 POST HTTP 方法发送。

我 copy/paste 它并写了一个快速的 README 文件。如果您有任何建议甚至请求请求,请分享。

希望对您有所帮助。

https://github.com/schnapse/json-to-requestparams