Waqar Ahmad
Waqar Ahmad

Reputation: 3732

Not able to read nested properties from doPost(e)

I am trying to create a webservice using the Contentservice in Apps Script and doPost(e) function to interact with Google Apps AdminDirectory service

Here is the overview of my code. I saved this as my server and published it as a websapp

function doPost(e) {
  var data = e.parameter;  
  var resourceType = data.resourceType;
  var method = data.method;
  var resource = data.resource;

  var resourceParams = resource.parameters;

//other code to work with AdminDIrectory
// return ContentService.createTextOutput(myoutputdata).setMimeType(ContentService.MimeType.JSON);
}

In my client code which I wrote using Apps Script to test the webservice

function test() {
  var jsonData = {
    authKey : 'HwZMVe3ZCGuPOhTSmdcfOqsl12345678',
    resourceType : 'user',
    method : 'get',
    resource : {
      parameters : {
        userKey : '[email protected]'
      }
    }
  }

  var url = 'https://script.google.com/macros/s/xyzabc12345678_wE3CQV06APje6497dyI7Hh-mQMUFM0pYDrk/exec';

  var params = {
    method : 'POST',
    payload : jsonData
  }

  var resp = UrlFetchApp.fetch(url, params).getContentText();

  Logger.log(resp);
}

Now when I try to read e.parameter.resource.parameters on server side, it gives error and shows that e.parameter.resource is string type. How I can read nested objects on server side? It seems, it is recognizing only first level parameters.

Upvotes: 2

Views: 913

Answers (2)

mhawksey
mhawksey

Reputation: 2053

Using

function doPost(e) {
  return ContentService.createTextOutput(JSON.stringify(e.parameter)).setMimeType(ContentService.MimeType.JSON); 

You get the response
"{"authKey":"HwZMVe3ZCGuPOhTSmdcfOqsl12345678","resource":"{parameters={[email protected]}}","method":"get","resourceType":"user"}"

so it looks like it is flattening any nests into a string. In the comments of a similar problem it is noted that the documentation for UrlFetchApp permits the payload to be "It can be a String, a byte array, or a JavaScript key/value map", but I assume this doesn't extend to nested key/value maps.

As noted in the other answer the solution would be to stringify the payload e.g.

var params = {
      method : 'POST',
      payload : {'data':JSON.stringify(jsonData)}
    };

I had problems handling the payload just as a string which is why I used a key value

On the server side script you can handle with

function doPost(e) {
  var data = JSON.parse(e.parameter.data);
  var userKey = data.resource.parameters.userKey;
  ...
}

Upvotes: 3

Edgar Villegas Alvarado
Edgar Villegas Alvarado

Reputation: 18354

Maybe it arrives as JSON string? If that's the case you'd have to parse it back-end, something like:

resourceObj = JSON_PARSE_METHOD(e.parameter.resource);

for example in PHP this would be

$resourceObj = json_decode(e->parameter->resource);

You could find out if it's a JSON string by printing its value (or debugging it) on the backend.

Hope this helps. Cheers

Upvotes: 0

Related Questions