当一批中有多个 PATCH 请求时,为什么我的 Drive API 请求会失败?
Why does my Drive API request fail when there is more than one PATCH request in a batch?
我正在尝试将新的 parent 文件夹添加到我的大量 Google 云端硬盘文件中。我正在使用批处理请求来避免发送太多请求,但是当有多个 PATCH 请求添加到批处理时,这不起作用。 Google 服务器正在返回 502 Bad Gateway
HTTP 错误响应。出了什么问题或者我该如何解决这个问题?
一般:
Remote Address:216.58.196.138:443
Request URL:https://content.googleapis.com/batch
Request Method:POST
Status Code:502 OK
回应headers:
alt-svc:quic=":443"; ma=604800; v="30,29,28,27,26,25"
alternate-protocol:443:quic,p=1
content-length:1613
content-type:text/html; charset=UTF-8
date:Tue, 01 Dec 2015 06:18:36 GMT
server:GFE/2.0
status:502
请求headers:
:authority:content.googleapis.com
:method:POST
:path:/batch
:scheme:https
accept:*/*
accept-encoding:gzip, deflate
accept-language:ru,en-US;q=0.8,en;q=0.6,de;q=0.4,pt;q=0.2,uk;q=0.2,it;q=0.2
authorization:Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
content-length:2291
content-type:multipart/mixed; boundary=batch691088898561756483
dnt:1
origin:https://content.googleapis.com
referer:https://content.googleapis.com/static/proxy.html?jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.Dm6zFqHZO9M.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Ft%3Dzcms%2Frs%3DAGLTcCPQ-9iC9Y-vGIOJ-RoQCZkFL66QXw
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
x-chrome-uma-enabled:1
x-client-data:CKW2yQEIqbbJAQjEtskBCPCIygEI/ZXKAQi8mMoB
x-clientdetails:appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
x-goog-encode-response-if-executable:base64
x-javascript-user-agent:google-api-javascript-client/1.1.0-beta
x-origin:http://app.local
x-referer:http://app.local
请求负载:
--batch691088898561756483
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <0B28tlN6SgYRacHVwdEQ5b1RtZmc>
PATCH /drive/v2/files/0B28tlN6SgYRacHVwdEQ5b1RtZmc?addParents=0B28tlN6SgYRaS2syM1VGWjllMnc
X-JavaScript-User-Agent: google-api-javascript-client/0.1
Authorization: Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
X-ClientDetails: appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
--batch691088898561756483
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <0B28tlN6SgYRadVFRV0lRQW1kVlE>
PATCH /drive/v2/files/0B28tlN6SgYRadVFRV0lRQW1kVlE?addParents=0B28tlN6SgYRaS2syM1VGWjllMnc
X-JavaScript-User-Agent: google-api-javascript-client/0.1
Authorization: Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
X-ClientDetails: appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
--batch691088898561756483
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <0B28tlN6SgYRaLW1qYmxrZUV2S0E>
PATCH /drive/v2/files/0B28tlN6SgYRaLW1qYmxrZUV2S0E?addParents=0B28tlN6SgYRaS2syM1VGWjllMnc
X-JavaScript-User-Agent: google-api-javascript-client/0.1
Authorization: Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
X-ClientDetails: appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
--batch691088898561756483--
尝试将 URL 更改为 https://www.googleapis.com/batch
而不是 https://content.googleapis.com/batch
使用您的确切请求和数据但更改 URL 我收到了一个 200,每个请求都有一个身份验证错误,正如旧令牌所预期的那样。
HTTP/1.1 200 OK
Vary: Origin
Vary: X-Origin
Content-Type: multipart/mixed; boundary=batch_NP9EsgqJk5k_AAFjWZ0MHaM
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alternate-Protocol: 443:quic,p=1
Alt-Svc: quic=":443"; ma=604800; v="30,29,28,27,26,25"
Content-Length: 2027
--batch_NP9EsgqJk5k_AAFjWZ0MHaM
Content-Type: application/http
Content-ID: <response-0B28tlN6SgYRacHVwdEQ5b1RtZmc>
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=invalid_token
Content-Type: application/json; charset=UTF-8
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
Content-Length: 249
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
--batch_NP9EsgqJk5k_AAFjWZ0MHaM
Content-Type: application/http
Content-ID: <response-0B28tlN6SgYRadVFRV0lRQW1kVlE>
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=invalid_token
Content-Type: application/json; charset=UTF-8
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
Content-Length: 249
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
--batch_NP9EsgqJk5k_AAFjWZ0MHaM
Content-Type: application/http
Content-ID: <response-0B28tlN6SgYRaLW1qYmxrZUV2S0E>
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=invalid_token
Content-Type: application/json; charset=UTF-8
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
Content-Length: 249
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
--batch_NP9EsgqJk5k_AAFjWZ0MHaM--
Google 的批次 API 记录不完整。以下是一些可以尝试的想法:
您可能使用了错误的端点(https://content.googleapis.com/batch
而不是 https://www.googleapis.com/batch
),正如 Brian 已经建议的那样。我从经验中知道,即使您在每个批处理请求中提供了正确的 Host:
header,也不能将不同主机名的请求批处理在一起。
您似乎是从 Chrome 浏览器提交批量请求,并且它正在使用 SPDY 或 HTTP/2 提交请求。如果您使用命令行工具(例如 curl
改为使用 HTTP/1.1 发送请求会怎样?
确切的错误响应是什么?看起来您收到的 502 Bad Gateway
响应带有 text/html
响应 body,这很奇怪。预期的行为是 200 OK
响应和 multipart/mixed
响应 body,包含针对您提交的每个单独请求的 application/http
消息。
您的批处理中 PATCH
个请求中的 None 个有 body,这可能是个问题。由于您要做的只是向每个文件添加一个新的 parent 文件夹,如果您改为尝试在批处理中发出 POST https://www.googleapis.com/drive/v2/files/{fileId}/parents
请求会怎样?
如果您正在寻求 Google 的回复,您可以尝试在 official Google Apps API issue tracker 上提交错误。但是,无法保证 Google Drive 团队会做出回应,而且我经常看到有效且可重现的错误一次几个月都没有得到确认。
此问题已在 Google Drive API v3 中解决。批处理工作正常。
我正在尝试将新的 parent 文件夹添加到我的大量 Google 云端硬盘文件中。我正在使用批处理请求来避免发送太多请求,但是当有多个 PATCH 请求添加到批处理时,这不起作用。 Google 服务器正在返回 502 Bad Gateway
HTTP 错误响应。出了什么问题或者我该如何解决这个问题?
一般:
Remote Address:216.58.196.138:443
Request URL:https://content.googleapis.com/batch
Request Method:POST
Status Code:502 OK
回应headers:
alt-svc:quic=":443"; ma=604800; v="30,29,28,27,26,25"
alternate-protocol:443:quic,p=1
content-length:1613
content-type:text/html; charset=UTF-8
date:Tue, 01 Dec 2015 06:18:36 GMT
server:GFE/2.0
status:502
请求headers:
:authority:content.googleapis.com
:method:POST
:path:/batch
:scheme:https
accept:*/*
accept-encoding:gzip, deflate
accept-language:ru,en-US;q=0.8,en;q=0.6,de;q=0.4,pt;q=0.2,uk;q=0.2,it;q=0.2
authorization:Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
content-length:2291
content-type:multipart/mixed; boundary=batch691088898561756483
dnt:1
origin:https://content.googleapis.com
referer:https://content.googleapis.com/static/proxy.html?jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.Dm6zFqHZO9M.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Ft%3Dzcms%2Frs%3DAGLTcCPQ-9iC9Y-vGIOJ-RoQCZkFL66QXw
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
x-chrome-uma-enabled:1
x-client-data:CKW2yQEIqbbJAQjEtskBCPCIygEI/ZXKAQi8mMoB
x-clientdetails:appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
x-goog-encode-response-if-executable:base64
x-javascript-user-agent:google-api-javascript-client/1.1.0-beta
x-origin:http://app.local
x-referer:http://app.local
请求负载:
--batch691088898561756483
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <0B28tlN6SgYRacHVwdEQ5b1RtZmc>
PATCH /drive/v2/files/0B28tlN6SgYRacHVwdEQ5b1RtZmc?addParents=0B28tlN6SgYRaS2syM1VGWjllMnc
X-JavaScript-User-Agent: google-api-javascript-client/0.1
Authorization: Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
X-ClientDetails: appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
--batch691088898561756483
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <0B28tlN6SgYRadVFRV0lRQW1kVlE>
PATCH /drive/v2/files/0B28tlN6SgYRadVFRV0lRQW1kVlE?addParents=0B28tlN6SgYRaS2syM1VGWjllMnc
X-JavaScript-User-Agent: google-api-javascript-client/0.1
Authorization: Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
X-ClientDetails: appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
--batch691088898561756483
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <0B28tlN6SgYRaLW1qYmxrZUV2S0E>
PATCH /drive/v2/files/0B28tlN6SgYRaLW1qYmxrZUV2S0E?addParents=0B28tlN6SgYRaS2syM1VGWjllMnc
X-JavaScript-User-Agent: google-api-javascript-client/0.1
Authorization: Bearer ya29.PQI-rcaU2_Pd7tq3XufXVWPfje4ioMzBLhvKOieYuFgs2MnxTyQvtJ0QDR7EiWnN5SOPlGo
X-ClientDetails: appVersion=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36&platform=MacIntel&userAgent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_10_3)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F46.0.2490.86%20Safari%2F537.36
--batch691088898561756483--
尝试将 URL 更改为 https://www.googleapis.com/batch
而不是 https://content.googleapis.com/batch
使用您的确切请求和数据但更改 URL 我收到了一个 200,每个请求都有一个身份验证错误,正如旧令牌所预期的那样。
HTTP/1.1 200 OK
Vary: Origin
Vary: X-Origin
Content-Type: multipart/mixed; boundary=batch_NP9EsgqJk5k_AAFjWZ0MHaM
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alternate-Protocol: 443:quic,p=1
Alt-Svc: quic=":443"; ma=604800; v="30,29,28,27,26,25"
Content-Length: 2027
--batch_NP9EsgqJk5k_AAFjWZ0MHaM
Content-Type: application/http
Content-ID: <response-0B28tlN6SgYRacHVwdEQ5b1RtZmc>
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=invalid_token
Content-Type: application/json; charset=UTF-8
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
Content-Length: 249
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
--batch_NP9EsgqJk5k_AAFjWZ0MHaM
Content-Type: application/http
Content-ID: <response-0B28tlN6SgYRadVFRV0lRQW1kVlE>
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=invalid_token
Content-Type: application/json; charset=UTF-8
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
Content-Length: 249
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
--batch_NP9EsgqJk5k_AAFjWZ0MHaM
Content-Type: application/http
Content-ID: <response-0B28tlN6SgYRaLW1qYmxrZUV2S0E>
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=invalid_token
Content-Type: application/json; charset=UTF-8
Date: Thu, 03 Dec 2015 13:52:18 GMT
Expires: Thu, 03 Dec 2015 13:52:18 GMT
Cache-Control: private, max-age=0
Content-Length: 249
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
--batch_NP9EsgqJk5k_AAFjWZ0MHaM--
Google 的批次 API 记录不完整。以下是一些可以尝试的想法:
您可能使用了错误的端点(
https://content.googleapis.com/batch
而不是https://www.googleapis.com/batch
),正如 Brian 已经建议的那样。我从经验中知道,即使您在每个批处理请求中提供了正确的Host:
header,也不能将不同主机名的请求批处理在一起。您似乎是从 Chrome 浏览器提交批量请求,并且它正在使用 SPDY 或 HTTP/2 提交请求。如果您使用命令行工具(例如
curl
改为使用 HTTP/1.1 发送请求会怎样?确切的错误响应是什么?看起来您收到的
502 Bad Gateway
响应带有text/html
响应 body,这很奇怪。预期的行为是200 OK
响应和multipart/mixed
响应 body,包含针对您提交的每个单独请求的application/http
消息。
您的批处理中 None 个有 body,这可能是个问题。由于您要做的只是向每个文件添加一个新的 parent 文件夹,如果您改为尝试在批处理中发出
POST https://www.googleapis.com/drive/v2/files/{fileId}/parents
请求会怎样?
PATCH
个请求中的 如果您正在寻求 Google 的回复,您可以尝试在 official Google Apps API issue tracker 上提交错误。但是,无法保证 Google Drive 团队会做出回应,而且我经常看到有效且可重现的错误一次几个月都没有得到确认。
此问题已在 Google Drive API v3 中解决。批处理工作正常。