如何从包含头部和主体的响应中提取JSON数据?

3 投票
1 回答
6518 浏览
提问于 2025-04-17 14:46

这是我第一次在Stack Overflow上提问,因为通常我能在这里找到解决问题的方法,但这次我遇到的情况比较特殊,找不到答案。我正在为我的编译器写一个Python插件,这个插件可以输出不同语言的REST调用,以便与API进行交互。我通过socket和ssl模块进行身份验证,发送用户名和密码,内容是JSON格式的请求体。成功认证后,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>"} 

对于Python程序员来说,这可能是个非常基础的问题,因为Python在字符串处理方面有很强大的工具。不过,我是个新手程序员,之前主要用Java。我想知道,解析这个响应以获取"<token>""<secret>"的最佳方法是什么?我是否应该寻找一个"{",然后把子字符串放入一个JSON对象中?我的直觉告诉我可以尝试使用re模块,但我不太明白在这种情况下该怎么用,因为token和secret的模式显然是不可预测的。由于我选择使用低级模块进行身份验证,这个响应实际上是一个大字符串,通过构建头部并将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)

打印语句输出了第一个代码示例。任何帮助或建议我都会非常感激!

1 个回答

3

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)可以帮你更轻松地完成这些工作。

撰写回答