我正在使用Javascript(在Google Apps脚本编辑器中)向Google Drive API发出HTTP请求。
我已成功拨打API,因此我知道我的Oauth 2可以正常工作,但现在我正在制作批量请求。
我将遍历每个文件,并为每个文件进行2次API调用。
我的要求:
var newOwnerEmail = 'archive@test.com';
var newEditorEmail = 'admin@test.com';
var fileIds = ['a', 'b', 'c'];
const boundary = 'testboundaryname';
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delim = "\r\n--" + boundary + "--";
var multipartRequestBody = '';
for (var i = 0; i < fileIds.length; i++) {
var fileId = fileIds[i];
var resource1 = { role: "owner", type: "user", value: newOwnerEmail };
var requestBody = {};
requestBody.path = '/drive/v2/files/' + fileId + '/permissions';
requestBody.method = 'POST';
requestBody.contentType = 'application/json';
requestBody.payload = JSON.stringify(resource1);
requestBody.muteHttpExceptions = true;
multipartRequestBody += delimiter;
multipartRequestBody += 'Content-Type: application/json\r\n';
multipartRequestBody += JSON.stringify(requestBody);
var resource2 = { role: "writer", type: "user", value: newEditorEmail };
requestBody.payload = JSON.stringify(resource2);
multipartRequestBody += delimiter;
multipartRequestBody += 'Content-Type: application/json\r\n';
multipartRequestBody += JSON.stringify(requestBody);
}
multipartRequestBody += close_delim;
var batchUrl = 'https://www.googleapis.com/batch';
var batchRequestBody = {};
batchRequestBody.headers = { Authorization: 'Bearer ' + service.getAccessToken() };
batchRequestBody.method = 'POST';
batchRequestBody.contentType = 'multipart/mixed; boundary="' + boundary + '"';
batchRequestBody.body = multipartRequestBody;
batchRequestBody.muteHttpExceptions = true;
try {
var batchResponse = UrlFetchApp.fetch(batchUrl, batchRequestBody);
Logger.log(batchResponse);
multipartRequestBody
最终成为一个如下所示的字符串:
--testboundary
Content-Type: application/json
{"method":"POST","contentType":"application/json","payload":"{\"role\":\"owner\",\"type\":\"user\",\"value\":\"archive@test.com\"}","muteHttpExceptions":false}
--testboundary
Content-Type: application/json
{"method":"POST","contentType":"application/json","payload":"{\"role\":\"writer\",\"type\":\"user\",\"value\":\"admin@test.com\"}","muteHttpExceptions":false}
--testboundary
Content-Type: application/json
{"method":"POST","contentType":"application/json","payload":"{\"role\":\"owner\",\"type\":\"user\",\"value\":\"archive@test.com\"}","muteHttpExceptions":false}
--testboundary
Content-Type: application/json
{"method":"POST","contentType":"application/json","payload":"{\"role\":\"writer\",\"type\":\"user\",\"value\":\"admin@test.com\"}","muteHttpExceptions":false}
--testboundary
Content-Type: application/json
{"method":"POST","contentType":"application/json","payload":"{\"role\":\"owner\",\"type\":\"user\",\"value\":\"archive@test.com\"}","muteHttpExceptions":false}
--testboundary
Content-Type: application/json
{"method":"POST","contentType":"application/json","payload":"{\"role\":\"writer\",\"type\":\"user\",\"value\":\"admin@test.com\"}","muteHttpExceptions":false}
--testboundary--
我跑UrlFetchApp.getRequest()
看看发送到服务器的内容,就是这样:
{
"headers": {
"Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"X-Forwarded-For": “(our external IP address)“
},
"method": "post",
"payload": "\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"owner\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"archive@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"writer\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"admin@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"owner\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"archive@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"writer\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"admin@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"owner\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"archive@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"writer\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"admin@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"owner\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"archive@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"writer\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"admin@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"owner\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"archive@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary\r\nContent-Type: application/json\r\n{\"method\":\"POST\",\"contentType\":\"application/json\",\"payload\":\"{\\\"role\\\":\\\"writer\\\",\\\"type\\\":\\\"user\\\",\\\"value\\\":\\\"admin@test.com\\\"}\",\"muteHttpExceptions\":false}\r\n--testboundary--",
"followRedirects": true,
"validateHttpsCertificates": true,
"useIntranet": false,
"contentType": "multipart/mixed; boundary=\"testboundary\"",
"url": "https://www.googleapis.com/batch"
}
我收到了这个回复:
Unsupported number format: --
请求的内容肯定有问题,但鉴于使用Javascript创建批量请求的文档很少,很难确定它是什么。
我能找到的唯一文档是this,但该示例与语言无关/假设。
然后我找到了this example,它似乎使用的是Google API客户端库,我无法在Apps脚本中使用它。