Android / Loopj - 如何将复杂的JSON对象发布到服务器?

时间:2017-03-15 00:21:49

标签: php android json android-async-http loopj

在我的一个应用程序中,我使用Loopj库,我需要将一个复杂的对象发送到一个Web服务(在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始终为空。我搜索了不同的提示,但没有一个是有效的。我没有限制我的网络服务中的路由,只是一个简单的函数来转储已发布的参数。

编辑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对象生成正确的键/值。

例如,JSON对象:

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

它以3对键/值转换:

  • 用户[0] [姓名]:jean
  • 用户[0] [年龄]:25
  • 用户[0] [城市]:巴黎。

所以,我想我需要一个函数将我的JSONObject转换为RequestParams对象并发送它#34;通常&#34;通过&#34; x-www-form-urlencoded&#34;。我不知道是否有任何本机功能可以做到这一点,但我找到了等效的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("&");
}

1 个答案:

答案 0 :(得分:1)

正如我之前所说,我写了一个帮助器类,它将JSONObject转换为RequestParams,它通常可以&#34;#34;通过POST HTTP方法发送。

我复制/粘贴它并写了一个快速的README文件。如果您有任何建议甚至是拉取请求,请分享。

希望它有所帮助。

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