【问题标题】:How to extract JSON data from a response containing a header and body?如何从包含标题和正文的响应中提取 JSON 数据?
【发布时间】:2013-01-19 22:21:01
【问题描述】:

这是我向 Stack Overflow 提出的第一个问题,因为通常我可以在这里找到我的问题的解决方案,但对于这种特殊情况,我不能。我正在为我的编译器编写一个 Python 插件,它以各种语言输出 REST 调用以与 API 交互。我通过在请求正文中以 JSON 形式发送用户名和密码来使用套接字和 ssl 模块进行身份验证。身份验证成功后,API 会返回以下格式的响应,正文中包含重要的响应数据:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Date: Tue, 05 Feb 2013 03:36:18 GMT
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,OPTIONS,GET
Access-Control-Allow-Headers: Content-Type
Server: Restlet-Framework/2.0m5
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 94

{"authentication-token":"<token>","authentication-secret":"<secret>"} 

这对于 Pythonistas 来说可能是一个非常基本的问题,因为它具有强大的字符串操作工具。但是,唉,我是一个从 Java 开始的新程序员。我想知道解析整个响应以获得"&lt;token&gt;""&lt;secret&gt;" 的最佳方法是什么?我应该使用搜索“{”并将子字符串转储到 json 对象中吗?我的直觉告诉我尝试使用 re 模块,但我似乎无法弄清楚在这种情况下如何使用它,因为令牌和秘密的模式显然是不可预测的。因为我选择了使用低级模块集进行身份验证,所以这个响应是一个大字符串,通过构造头部并将 JSON 数据附加到正文中,然后执行请求并使用以下代码获取响应:

#Socket configuration and connection execution
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn = ssl.wrap_socket(sock, ca_certs = pem_file)
conn.connect((host, port))
conn.send(req)

response = conn.recv()
print(response)

print 语句输出第一个代码示例。 非常感谢任何帮助或见解!

【问题讨论】:

  • 这可能对你有帮助 (stackoverflow.com/questions/6386308/…)
  • 我在尝试使用请求库(使用信任库)通过 SSL 进行身份验证时遇到了许多问题。因此,我不能直接将响应转储到 json 对象中,因为它会引发 ValueError,因为响应包含标头和正文。

标签: python json string authentication extract


【解决方案1】:

HTTP 标头通过\r\n\r\n 序列与正文的​​其余部分分开。执行以下操作:

import json

...

(headers, js) = response.split("\r\n\r\n")
data = json.loads(js)
token = data["authentication-token"]
secret = data["authentication-secret"]

您可能想要检查响应等,而各种库(例如requests)可以为您轻松完成所有这些工作。

【讨论】:

  • 谢谢!知道标题和正文以标准方式拆分非常有用。这正是我一直在寻找的优雅解决方案。不幸的是,要么我无法弄清楚如何正确使用此身份验证的请求,要么它还没有得到很好的支持。我需要使用信任库并在请求正文中以 json 格式提交用户名和密码。找不到使用库当前实现的方法。无论如何,再次感谢!
  • 这是个坏主意,尝试重新实现 http 解析器。如果服务器使用“\n”,它会失败,如果响应不是 7 位纯的,它会失败(给定问题中的 Content-type 标头)。如果服务器没有关闭连接,你怎么知道何时停止读取没有 Content-length 标头的响应。它相当于使用正则表达式解析 html。它很脆弱。应该使用真正的解析器,例如http-parser
  • @AndrewHarasta:如果您不知道如何将requests 与信任库一起使用;你可以ask a question specifically about it(你可以将必要的证书从信任库导出到 pem 文件,因为它已经存在于你的代码中)
  • @JFSebastian 我想你是对的,我应该问这个问题,因为与请求库有关的所有其他问题都与我的略有不同,它似乎是每个人最喜欢的 http 交互工具.该解决方案确实有效,但您在此处提出的潜在问题似乎是有效的担忧。我将研究使用解析器,并尝试重新实现请求。谢谢。
猜你喜欢
  • 2021-11-14
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多