NetSuite RESTlet错误代码:INVALID_RETURN_DATA_FORMAT

时间:2017-04-20 16:57:16

标签: rest netsuite restlet

我尝试通过RESTlet API调用已保存的搜索,并部署了我的RESTlet,但在尝试运行它时,我收到以下错误:

  

错误代码:INVALID_RETURN_DATA_FORMAT

     

错误消息:数据格式无效。你应该返回TEXT。

查看我的脚本,我无法确定错误的位置。以下是我试图运行的脚本

function GetSearchResult(){
    //array container for search results
    var output = new Array();

    //get search results
    var results = nlapiSearchRecord('transaction','customsearchid',null,null);
    var columns = results[0].getAllColumns();

    //loop through the search results
    for(var i in results){
        //create placeholder object place holder
        var obj = new searchRow(
          //set the values of the object with the values of the appropriate columns
          results[i].getValue(columns[0]),
          results[i].getValue(columns[1]),
          results[i].getValue(columns[2]),
          results[i].getValue(columns[3]),
          results[i].getValue(columns[4]),
          results[i].getValue(columns[5]),
          results[i].getValue(columns[6]),
          results[i].getValue(columns[7]),
          results[i].getValue(columns[8]),
          results[i].getValue(columns[9]),
          results[i].getValue(columns[10]),
          results[i].getValue(columns[11]),
          results[i].getValue(columns[12])
          );

        //add the object to the array of results
        output.push(obj);
    }

    //return the array of search objects
    return output;
}

//Object to serve a place holder for each search row
function searchRow(internalid,lineid,subsidiaryid,locationid,departmentid,accountid,date,name,memo,amount,uniqueid,product,period){
    this.internalid = internalid;
    this.lineid = lineid;
    this.subsidiaryid = subsidiaryid;
    this.locationid = locationid;
    this.departmentid = departmentid;
    this.accountid = accountid;
    this.date = date;
    this.name = name;
    this.memo = memo;
    this.amount = amount;
    this.uniqueid = uniqueid;
    this.product = product;
    this.period = period;

}

谢谢!

2 个答案:

答案 0 :(得分:3)

问题只是您需要请求中的内容类型application / json。

for..in适用于真正的数组。 Netsuite的搜索结果并不总是像真正的数组一样,所以我经常会这样做

var x = (nlapiSearchRecord(...) || []);

x.forEach(function(r){

});

就JSON而言,我只是返回对象。我从未遇到您遇到的错误 - 如果我发送没有Content-Type标头的GET请求,我会收到错误 - 您的客户端程序可能正在设置text / plain的内容类型这就是为什么NS期望文本输出。

只需一点跟进: 如果您发送标题,即使是在GET请求中,Netsuite也会将您的查询字符串(如果有的话)解释为键值对的对象并将其传递给您的函数并将您返回的对象作为JSON传输,因此不需要自己调用JSON.stringify。

如果您没有设置标题,那么如果您希望客户端程序接收JSON,则必须在传入的数据上调用JSON.parse,并在返回的数据上调用JSON.stringify。这有点奇怪,因为标准方式是让Netsuite查看Accept:标头并适当地制定数据。 Netsuite确实在他们的帮助中解释了这一点({3}}

答案 1 :(得分:2)

确保您发送Content-Type application/json标头,并附上您的请求。我相信您还需要return JSON.stringify(output);而不仅仅是return output;

您也不想在代码中使用JavaScript for..in;它是only meant for Object iteration。相反,您应该使用标准的for循环。