0
function Run_Mutation(){
  
  var token = "Bearer [Censored]"
  var Business_ID = "[Censored]"
  var url = "https://gql.waveapps.com/graphql/public";
  
  var query = 
 "mutation Mutation($input: CustomerCreateInput!) {\
  customerCreate(input: $input) {\
    didSucceed\
  }\
}";
  
  var variables = {
  "input": {
    "businessId": Business_ID,
    "name": "Santa",
    "firstName": "Saint",
    "lastName": "Nicholas",
    "email": "santa@example.com",
    "address": {
      "city": "North Pole",
      "postalCode": "H0H 0H0",
      "provinceCode": "CA-NU",
      "countryCode": "CA"
    },
    "currency": "CAD"
  }
};
    
    var headers = {
      'muteHttpExceptions' : true,
      'contentType' : 'application/json',
      'authorization' : token
  }
    
    var data = {
        "operationName": "Mutation",
        "query" : query,
        "variables" : variables
      }
    
    var options = {
      'method' : 'POST',
      'headers' : headers,
      'payload' : data
    }
    
    var response = UrlFetchApp.fetch(url, options);
    Logger.log(response);
}

上面的脚本是 GraphQL 中的一个示例突变请求。具体来说,这是与 Wave Accounting API 交互以为特定业务创建客户,令牌和业务 ID 出于显而易见的原因被审查,客户只是一个占位符。

该脚本在 Wave API Playground 上完美运行,甚至在 Apollo 等第三方平台上也能完美运行。但是,当插入 Google App Script 时,我收到错误消息:

POST 正文丢失。你忘记使用 body-parser 中间件了吗?

我如何能够将 body-parser 中间件集成到我的脚本中?我假设它仅在 GAS 上不起作用,因为我提到的其他两个服务具有可以与 Wave API 服务器交互的 body-parser 中间件。如果不是这样,我将如何在 GAS 中提出突变请求?

查询请求工作得很好,突变是唯一的问题。

4

1 回答 1

1

在您的脚本中,'contentType' : 'application/json''muteHttpExceptions' : true在请求标头中使用。并且,在 处'payload' : data,的对象data不会转换为字符串。当我看到 GraphQL API 的官方文档时,似乎数据是作为application/json. 参考我认为你的错误的原因POST body missing. Did you forget use body-parser middleware?可能是由于这个。

从这种情况来看,下面的修改呢?

从:

  var headers = {
    'muteHttpExceptions' : true,
    'contentType' : 'application/json',
    'authorization' : token
}
  
  var data = {
      "operationName": "Mutation",
      "query" : query,
      "variables" : variables
    }
  
  var options = {
    'method' : 'POST',
    'headers' : headers,
    'payload' : data
  }

至:

var headers = {'authorization': token}
var data = {
  "operationName": "Mutation",
  "query": query,
  "variables": variables
}
var options = {
  'method': 'POST',
  'headers': headers,
  'payload': JSON.stringify(data),
  'muteHttpExceptions': true,
  'contentType': 'application/json',
}

笔记:

  • 如果要设置query如下,

      mutation Mutation($input: CustomerCreateInput!) {
        customerCreate(input: $input) {
          didSucceed
        }
      }
    
  • 请进行如下修改。

    •     var query = 
         "mutation Mutation($input: CustomerCreateInput!) {\
          customerCreate(input: $input) {\
            didSucceed\
          }\
        }";
      
    •     var query = `mutation Mutation($input: CustomerCreateInput!) {
          customerCreate(input: $input) {
            didSucceed
          }
        }`;
      
    • 或者

        var query = "mutation Mutation($input: CustomerCreateInput!) {\n  customerCreate(input: $input) {\n    didSucceed\n  }\n}";
      

笔记:

  • 在此修改中,它假设您的请求正文 ( data) 和您的令牌是有效的。请注意这一点。当上述修改发生错误时,您能否再次确认您的请求正文和您的令牌。

参考:

于 2021-05-16T03:05:50.523 回答