GASのUrlfetchAppはリクエスト送信時に特有のUserAgentを付け加えます。
サーバーは、そのUserAgentを判別してアクセスを弾いている可能性があります。
なお、このUserAgentは変更できません。(ヘッダに任意のUser-Agentを付け加えても元のUser-Agentに上書きされます)
追記
どのような内容のrequestを行ったかを知りたいとき、https://httpbin.org/ というサイトを利用することができます。
今回のように、post内容を調べたい場合は、https://httpbin.org/post というエンドポイントに対してpostすると、自分がpostした内容がそのままレスポンスとして返ってきます。
質問文のpost内容を調べてみました。
調べるためのソースコードは以下です。(単純に、apiエンドポイントを "https://httpbin.org/post"に変えて、responseをダンプしているだけです)
python
python
1import requests
2
3url = "https://httpbin.org/post"
4
5payload={}
6headers = {
7 'X-Authorization': 'abcdefghijklmn'
8}
9
10response = requests.request("POST", url, headers=headers, data=payload)
11
12
13print(response.text)
GAS
js
1function sending(yesorno, requestId) {
2 var requestId = "*******************"
3 var STAGING_KEY = "abcdefghijklmn"
4
5 // var url = url = "http://myapi/internal/ocr/"+requestId+"/ng"
6 var url = "https://httpbin.org/post"
7 var data = {}
8 var options = {
9 'muteHttpExceptions': true,
10 'method': 'post',
11 'payload': JSON.stringify(data),
12 'headers': {
13 'X-Authorization': STAGING_KEY
14 }
15 };
16
17 //Error processing
18 try {
19 var response = JSON.parse(UrlFetchApp.fetch(url, options));
20 Logger.log(JSON.stringify(response,undefined,1))
21 if (response && response["id"]) {
22 return 'sent';
23 } else {
24 //reportError("Invalid response: " + JSON.stringify(response));
25 //return 'error';
26 Logger.log('error')
27 }
28 } catch (e) {
29 //reportError(e.toString());
30 //return 'error';
31 Logger.log('error')
32 }
33}
<結果比較>
pythonのレスポンス
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.12.4",
"X-Amzn-Trace-Id": "Root=*-******-***************",
"X-Authorization": "abcdefghijklmn"
},
"json": null,
"origin": "***.***.***.***",
"url": "https://httpbin.org/post"
}
GASのレスポンス
diff
1{
2 "args": {},
3 "data": "",
4 "files": {},
5+"form": {
6+ "{}": ""
7+},
8 "headers": {
9 "Accept-Encoding": "gzip, deflate, br",
10+ "Content-Length": "2",
11 "Content-Type": "application/x-www-form-urlencoded",
12 "Host": "httpbin.org",
13 "User-Agent": "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: *****-********************)",
14 "X-Amzn-Trace-Id": "Root=*-******-***************",
15 "X-Authorization": "abcdefghijklmn"
16 },
17 "json": null,
18+"origin": "****:****:****:****:****:****:****:****, ***.***.***.***",
19 "url": "https://httpbin.org/post"
20}
比較した結果、色付き(先頭行が+の行)が主な相違点です。
まとめると
- form(pythonは {}だが、GASは {"{}":""}
- Content-Length (python は0、GASは2)
- origin (pythonはIPv4、GASはIPv6)
- User-Agent(前述)
となっています。
おそらく、2は1に依存しています。
もし違いが出るとするならば、formのところと推測されます。
formに関して、GASの方をpythonと同じ形にするには、下記のように、payloadを削除すればよいことがわかりました。
GAS改
js
1function sending(yesorno, requestId) {
2 var requestId = "*******************"
3 var STAGING_KEY = "abcdefghijklmn"
4
5 // var url = url = "http://myapi/internal/ocr/"+requestId+"/ng"
6 var url = "https://httpbin.org/post"
7 var data = {}
8 var options = {
9 'muteHttpExceptions': true,
10 'method': 'post',
11 // 'payload': JSON.stringify(data), //削除
12 'headers': {
13 'X-Authorization': STAGING_KEY
14 }
15 };
16
17 //Error processing
18 try {
19 var response = JSON.parse(UrlFetchApp.fetch(url, options));
20 Logger.log(JSON.stringify(response,undefined,1))
21 if (response && response["id"]) {
22 return 'sent';
23 } else {
24 //reportError("Invalid response: " + JSON.stringify(response));
25 //return 'error';
26 Logger.log('error')
27 }
28 } catch (e) {
29 //reportError(e.toString());
30 //return 'error';
31 Logger.log('error')
32 }
33}
上記のように「payloadなし」で試してみてはいかがでしょうか。