Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
191 views
in Technique[技术] by (71.8m points)

jsonp ajax in google script

I'm trying to learn how to query for data from a local government data site (hoping I can teach my math students to do some data analysis). I'm hoping to get the data and insert them into Google Sheets. The following is a sample provided by the official site on how to do a query:

var data = {
  resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
  limit: 5, // get 5 results
  q: 'jones' // query for 'jones'
};
$.ajax({
  url: 'https://data.gov.sg/api/action/datastore_search',
  data: data,
  dataType: 'jsonp',
  success: function(data) {
    alert('Total results found: ' + data.result.total)
 }
});$

I tried the following code in Google Apps Script:

function testapi(){
  var data = {
    resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
    limit: 5, // get 5 results
    q: 'Yishun' 
  };

  var url = "https://data.gov.sg/api/action/datastore_search";
  var response = UrlFetchApp.fetch(url,data).getContentText();
}

I receive a 404 error. I think the option "data" was not passed.

Would appreciate some help. I am a math teacher, not a coding expert.

Update: I changed the code to this but still 404 error.

function testapi(){
  var data = {
    resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
    limit: 5, // get 5 results
    q: 'Yishun' // query for 'jones'
  };

  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'payload' : JSON.stringify(data)
  };  

  var url = "https://data.gov.sg/api/action/datastore_search";
      var response = UrlFetchApp.fetch(url,options).getContentText();

  }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Issue:

Whenever payload key is present in options/params argument of UrlFetchApp, the method is set to post by default. And any attempt to change the method to get is "silently" ignored. Other similar scripting platforms automatically convert the payload to url query parameters. But, UrlFetchApp silently changes the method to post and nothing else.

Solution:

Re-create the data object as a query string. For example, data:{x:1,y:2} should be changed to ?x=1&y=2 and appended to url.

Snippet:

function testapi() {
  var options = {
    method: 'get',
    // 'contentType': 'application/json',
    // 'payload' : data,//If set, method is ignored.
    headers: { Accept: '*/*', 'Content-Type': 'application/json' },
    muteHttpExceptions: true,
  };

  var url = 'https://data.gov.sg/api/action/datastore_search';
  //var url = 'https://httpbin.org/get'; test the method

  function objectToQueryParams(obj) {
    return (
      '?' +
      Object.entries(obj)
        .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
        .join('&')
    );
  }
  var data = {
    resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
    limit: 5, // get 5 results
    q: 'Yishun', // query for 'Yishun'
  };
  var query = objectToQueryParams(data);
  url += query;
  var response = UrlFetchApp.fetch(url, options).getContentText();
  Logger.log(response);
}

function objectToQueryParams(obj) {
  return (
    '?' +
    Object.entries(obj)
      .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
      .join('&')
  );
}


var data = {
  resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
  limit: 5, // get 5 results
  q: 'Yishun', // query for 'jones'
};
console.log(objectToQueryParams(data));

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...