【问题标题】:Google Mirror API throwing BadStatusLine exception (Python)Google Mirror API 引发 BadStatusLine 异常(Python)
【发布时间】:2013-06-18 23:03:13
【问题描述】:

在使用 Mirror API 时,我从几个 API 调用中随机得到一个“BadStatusLine”异常,包括timeline().inserttimeline.list。通过在 Python 中寻找类似问题的 SO,我怀疑这是来自服务器的某种格式错误的响应。

这似乎是随机发生的,可能是在一段时间不使用 API 之后发生的。这是一个示例堆栈跟踪:

 Traceback (most recent call last):
   File "service.py", line 61, in receive_message
     self.process_user_chat(msg)
   File "service.py", line 304, in process_user_chat
     self.upsert_timeline_item(sourceItemId, body)
   File "service.py", line 86, in upsert_timeline_item
     new_item = self.glass_service.timeline().insert(body=body).execute()
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 128, in positional_wrapper
     return wrapped(*args, **kwargs)
   File "/usr/local/lib/python2.7/dist-packages/apiclient/http.py", line 676, in execute
     body=self.body, headers=self.headers)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 128, in positional_wrapper
     return wrapped(*args, **kwargs)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 494, in new_request
     self._refresh(request_orig)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 653, in _refresh
     self._do_refresh_request(http_request)
   File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 682, in _do_refresh_request
     self.token_uri, method='POST', body=body, headers=headers)
   File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1570, in request
     (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
   File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1317, in _request
     (response, content) = self._conn_request(conn, request_uri, method, body, headers)
   File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1286, in _conn_request
     response = conn.getresponse()
   File "/usr/lib/python2.7/httplib.py", line 1034, in getresponse
    response.begin()
   File "/usr/lib/python2.7/httplib.py", line 407, in begin
     version, status, reason = self._read_status()
   File "/usr/lib/python2.7/httplib.py", line 371, in _read_status
     raise BadStatusLine(line)
 BadStatusLine: ''

这段代码大部分时间都有效,但每隔一段时间我就会收到这样的响应。


更新:我的代码正在创建 Google API 类并在服务期间使用它们。一旦有时间更新我的oauth2 令牌(1 小时),我会收到一次或两次此错误,然后它会再次开始工作。我能够重构我的代码,以便它在每个请求上创建 API 类,问题就消失了。这似乎是 Google API 中的一个已知错误,有关详细信息,请参阅 Anthony Tuininga 的选定答案。

【问题讨论】:

  • 有问题吗,或者这只是一个观察?
  • 大声笑,我想问题是我该如何解决这个问题?

标签: python google-mirror-api google-glass


【解决方案1】:

此问题似乎是一个已知问题。我自己一直都经历过。如果单个文件的上传时间超过 1 小时,则会出现此错误。如果上传了 不同 文件,API 会正确刷新令牌。有关更多信息,请参阅此错误。它显然还没有修复,并且没有关于何时修复的预计时间。 :-(

https://code.google.com/p/google-api-python-client/issues/detail?id=231

【讨论】:

  • 我的理论是 Google Api 的对象并不是为了长期存在而设计的。我正在创建 API 实例,然后在服务的整个生命周期中使用它们。一旦它们运行了足够长的时间以需要刷新,我就会遇到一次或两次此错误,然后它将再次开始工作。我已经重构了我的代码,所以我在每个请求上都创建了 API 类,问题就消失了。我想知道您是否可以使用相同的策略?一旦您收到可恢复上传的错误,请尝试重新创建 API 类并继续?
  • 我的问题是我正在上传一个 25 MB 大小的文件,并且在很多情况下需要超过一个小时。我不确定如何恢复上传,但开始新的上传就可以了。一段时间以来,我一直在寻找解决此问题的方法,这显然是一个常见问题。 API 显然没有处理这种情况。
【解决方案2】:

状态行是 HTTP 响应返回的第一行。它包含状态码,如 200、404、500 等。如果 httplib 无法读取状态行,它就无法读取任何相关信息。

问题通常是由错误的 HTTP 请求或服务器问题引起的。尝试从您的浏览器发出请求以查看它显示的内容。或者,您可以使用curlwget 发出请求。

您的堆栈跟踪显示oauth2client,因此您必须尝试使用​​ OAuth 2 协议。可能是上一个请求导致了错误,而这个请求只是在服务器处遇到了一个关闭的门。记录所有请求和响应可以帮助您了解导致失败的原因。

【讨论】:

  • 这对我来说很有意义。我正在使用 Google API / Mirror API,这一切都隐藏在其中,所以我希望得到一个不需要我侵入 Google 代码来使其工作的答案。
  • 这似乎是在我的服务一段时间不活动之后发生的(也许,这只是一个理论。)在尝试刷新 oauth2 令牌时似乎总是失败,但实际上未来的请求会工作。我想知道 httplib2 是否可能已关闭连接池,但不知何故系统没有完全意识到它并因此导致错误,然后稍后的请求会创建与服务器的新连接。这有意义吗?
  • 这可能很简单,因为他们的服务器太忙而无法响应,您需要重试请求。检查响应标头应该会对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2013-03-18
  • 2017-04-22
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多