使用`UrlFetchApp`的PUT请求返回'错误请求',但Google Apps脚本外的相同请求有效

时间:2012-11-29 19:49:44

标签: http curl https google-apps-script

这是发出请求的Google Apps脚本:

UrlFetchApp.fetch('https://user:password@sitename.com/api', {
  method: 'put',
  headers: { 'Accept': '*/*' },
  payload: 'foo=bar&baz=qux'
});

可以成功发布到http://requestb.in/进行审核:

PUT /1bfk94g1 HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; GoogleDocs; script; +http://docs.google.com)
Host: requestb.in
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
Connection: keep-alive
Accept-Encoding: gzip
Accept: */*

foo=bar&baz=qux

但请求网址为https://user:password@sitename.com/api时失败。显示的唯一错误信息是Bad request: https://user:password@sitename.com/api

我构造了一个curl命令,它产生完全相同的HTTP请求:

curl -XPUT \
     -H 'Accept-Encoding: gzip' \
     --user-agent 'Mozilla/5.0 (compatible; GoogleDocs; script; +http://docs.google.com)' \
     -d foo='bar' \
     -d baz='qux'\
     https://user:password@sitename.com/api

成功发布到https://user:password@sitename.com/api。两个相同的请求如何有不同的结果?我错过了关于我的Google Apps脚本的内容吗?我尝试过使用调试器,但没有用。

1 个答案:

答案 0 :(得分:2)

UrlFetchApp似乎尚未支持网址中包含凭据的请求。需要手动构建Authorization HTTP标头。以下作品:

var response = UrlFetchApp.fetch('https://sitename.com/api', {
  headers: {
    'Authorization': 'Basic ' + Utilities.base64Encode(user + ':' + password)
  }
});