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



在我的一个应用程序中,我使用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访问它们。那么,发送应用程序/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对象,并通过" x-www-form-urlenCoded"正常"发送它。我不知道是否有任何本机函数可以执行此操作,但我找到了JavaScript等效(javascript对象的查询 - 弦编码)。

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("&");
}

正如我之前所说的,我写了一个助手类,将jsonobject转换为请求params,可以通过http post http方法发送"正常"。

我将其复制/粘贴并编写了一个快速读数文件。如果您有任何建议,甚至需要拉起,请分享。

希望它有帮助。

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

最新更新