【问题标题】:Android / Loopj - How can i POST a complex JSON object to a server?Android / Loopj - 我如何将复杂的 JSON 对象发布到服务器?
【发布时间】:2017-03-15 00:21:48
【问题描述】:

在我的一个使用 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 对键/值:

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

所以,我想我需要一个函数,将我的 JSONObject 转换为 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("&");
}

【问题讨论】:

  • 如何在服务器端检查 $_POST 和 $_REQUEST?我相信您在发出请求后正在检查它,那么它总是为空的。
  • @Furqan PHP 部分不是重点。调用页面时,我将参数记录在文件中。我用 Postman 对其进行了测试,它正在工作。
  • @Steve 实际上,我可以在 php://input 中找到我发布的数据。问题是,我不是 Web 服务的所有者,参数应该可以通过 $_POST 访问。通过 application/json 发送数据不是解决方案吗?
  • $_POST 在您将数据作为键值对发送时填充:var1=cat&amp;var2=dog。我不熟悉你的 java http 库,但一个快速的谷歌建议你应该使用 RequestParams 对象而不是 JSONObject 以该格式发送数据

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


【解决方案1】:

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

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

希望对你有帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多