3

这是我向 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 开始的新程序员。我想知道解析整个响应以获得"<token>"and的最佳方法是"<secret>"什么?我应该使用搜索“{”并将子字符串转储到 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 语句输出第一个代码示例。任何帮助或见解将不胜感激!

4

1 回答 1

3

\r\n\r\nHTTP 标头按顺序与正文的其余部分分开。执行以下操作:

import json

...

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

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

于 2013-02-05T04:07:16.320 回答