从Google Sheet Script向Web服务发送JSON数组

时间:2015-01-10 21:34:38

标签: javascript php jquery json google-apps-script

我们有一个返回产品信息的网络服务。该服务期望在post数据中使用JSON数组......

来自简单HTML测试网页的示例脚本如下(这可以按预期工作):

    <script src="//code.jquery.com/jquery-1.11.2.min.js"></script>

    <script type="text/javascript">

    $(document).ready(function(){

    // request is array of product IDs e.g. pid:[71,72,74]

    // request is array of search terms e.g. find:['apples','oranges','pears']
    // request can contain requested fields from products
    // fields:['CostPrice','Published','title','Price']

    jQuery.ajax({
        url : 'http://somewebsite.com/__getProductData',
        type: 'POST',
        dataType : 'json',
        data: { pid:[658,71,6,700], fields:['pid','CostPrice','type','published','title'] },

    success:function(data) { 

        // do something with the response...    

        });


     },

    error: function(  jqXHR,  textStatus, errorThrown) {alert('Error Status:' + textStatus + '    Error:'+errorThrown); }

    }

    );


    });

    </script>

用PHP编写的Web服务正确接收。从客户端转储(print_r)Web服务接收的数据会产生以下数组:


    Array ( 
    [pid] => Array ( [0] => 658 [1] => 71 [2] => 6 [3] => 700 ) 

    [fields] => Array ( [0] => pid [1] => CostPrice [2] => type [3] => type [4] => published [5] => title ) 

现在问题....我正试图从Google Sheet Script中调用webservice,如下所示:

    function getProduct( pid,datetime) {

      // 
      var url = 'https://somewebsite.com/__getProductData';

      //pid:[658,71,6,700], fields:['pid','CostPrice','type','published','title']

      var nids = new Array( 658,71,6,700 );

      var fields = ['pid','CostPrice','type','published','title']
      var payload =
          { 
          pid : nids,
          fields: fields

       };

       var options =
       {
         "method": 'POST',

         "payload": payload


       };

      var response = UrlFetchApp.fetch(url, options);

     Logger.log(response);


    }

从Google表格脚本调用PHP Web服务时,无法正确接收JSON数组:

    Array ( [data] => { pid=[Ljava.lang.Object;@1bfbb500} fields=[Ljava.lang.Object;@3ffbb500})

我希望这是与编码或标题相关的东西......我尝试了大多数标题和contentType的组合,但无济于事......例如。

    var headers = { "Accept":"json", 
              "Content-Type":"application/json", 
             };

建议任何人?

3 个答案:

答案 0 :(得分:0)

var options = {
  "method":  'POST', 
  "payload": JSON.stringify(payload)
};

或者将pid&amp;的每个值字符串化。字段。

答案 1 :(得分:0)

Jonathan - 您建议的评论是解决方案......

这没有用:

var options =
 {
 "method": 'POST',
 "payload": JSON.stringify(payload)
 };

但是对有效负载数组元素进行了字符串化(请注意,简单元素在没有字符串化的情况下工作,例如&#39; text&#39;:&#34;有些文字在这里&#34;):

 var nids = [658,71,6,700 ];
 var fields = ['pid','CostPrice','type','published','title']
 var payload =
      { 
      pid : JSON.stringify(nids),
      fields: JSON.stringify(fields)
   };
var options =
 {
 "method": 'POST',
 "payload": payload
 };

答案 2 :(得分:0)

我想我已经解决了同样的问题: How to send a post request with an array in payload by urlfetchapp

有效载荷必须以这种方式准备!我在制作解决方法PHP脚本时发现了这个解决方案。

  var payload =
      {       
        "fields[0]":"firstString",
        "fields[1]":"anotherString in array",        
      }

不是很直观,但它对我很有用!