Titanium JIRA Archive
Titanium SDK/CLI (TIMOB)

[TIMOB-13357] Android: Titanium does not properly handle arrays in form-encoded POSTs

GitHub Issuen/a
TypeBug
PriorityLow
StatusOpen
ResolutionUnresolved
Affected Version/sn/a
Fix Version/sn/a
ComponentsAndroid
Labelsform-encoded, httpclient, post
ReporterMatt Baxter
AssigneeUnknown
Created2012-11-12T17:36:02.000+0000
Updated2018-02-28T20:03:38.000+0000

Description

When using the HTTPClient in Titanium Mobile, the documentation (http://docs.appcelerator.com/titanium/2.1/#!/api/Titanium.Network.HTTPClient-method-send) says that if you pass a serializable JavaScript object, it will automatically turn it into form-encoded POST data. However, this breaks when your data contains an array. Using the free service httpbin (http://httpbin.org/) to view the POST data that is sent, you can see that the array is not properly encoded. By sending POST data to httpbin.org/post, we can see the POST data that Titanium sends. Example code:
var xhr = Ti.Network.createHTTPClient();
xhr.onload = function(ev) {
  Ti.API.info(this.responseText);
};
xhr.open('POST','http://httpbin.org/post');
xhr.send({
  'test_text': 'testing',
  'test_array': ['one','two','three']
});
The response received looks like this:
{
   "files": {},
   "form": {
      "test_array": "[Ljava.lang.Object;@41a6e560",
      "test_text": "testing"
   },
   "url": "http://httpbin.org/post",
   "args": {},
   "headers": {
      "Content-Length": "63",
      "Connection": "keep-alive",
      "User-Agent": "",
      "Host": "httpbin.org",
      "X-Requested-With": "XMLHttpRequest",
      "Content-Type": "application/x-www-form-urlencoded"
   },
   "json": null,
   "data": ""
}
You will see the "test_array" has a value of "[Ljava.lang.Object;@41a6e560". However, sending the data as a url encoded string by changing the send statement to this:
xhr.send('test_text=testing&test_array=one&test_array=two&test_array=three');
Creates the correct post data:
{
   "origin": "64.128.22.8",
   "files": {},
   "form": {
      "test_array": [
         "one",
         "two",
         "three"
      ],
      "test_text": "testing"
   },
   "url": "http://httpbin.org/post",
   "args": {},
   "headers": {
      "Content-Length": "64",
      "Connection": "keep-alive",
      "User-Agent": "",
      "Host": "httpbin.org",
      "X-Requested-With": "XMLHttpRequest",
      "Content-Type": "application/x-www-form-urlencoded"
   },
   "json": null,
   "data": ""
}

Comments

  1. Kevin Purnelle 2013-05-23

    I had the same problem. @matt Thanks for the current tip to solve this problem :) http://developer.appcelerator.com/question/152751/how-can-i-see-the-request-headers-in-http-client-along-with-the-post-message--httpclient-problem#answer-263243
  2. josh rose 2013-12-16

    Just hit this as well and finally realized it was this bug after a bunch of debugging. This seems like an important scenario (Android + POSTing and array) in an essential module. Any chance this can get some traction after a year of being an issue?
  3. josh rose 2013-12-16

    Thanks Ingo!

JSON Source