说我有以下HTTP请求:
GET /4 HTTP/1.1 Host: graph.facebook.com
并且服务器返回以下响应:
HTTP/1.1 200 OK Access-Control-Allow-Origin: * Cache-Control: private, no-cache, no-store, must-revalidate Content-Type: text/javascript; charset=UTF-8 ETag: "539feb8aee5c3d20a2ebacd02db380b27243b255" Expires: Sat, 01 Jan 2000 00:00:00 GMT Pragma: no-cache X-FB-Rev: 1070755 X-FB-Debug: pC4b0ONpdhLwBn6jcabovcZf44bkfKSEguNsVKuSI1I= Date: Wed, 08 Jan 2014 01:22:36 GMT Connection: keep-alive Content-Length: 172 {"id":"4","name":"Mark Zuckerberg","first_name":"Mark","last_name":"Zuckerberg","link":"http:\/\/www.facebook.com\/zuck","username":"zuck","gender":"male","locale":"en_US"}
由于Content-Lengh
标题取决于内容的长度,我不能简单地用Content-Length: 172
字符串分割 .如何单独提取JSON和标头?它们对我的计划都很重要.我正在使用此代码来获取响应:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("graph.facebook.com", 80)) s.send("GET /"+str(id)+"/picture HTTP/1.1\r\nHost: graph.facebook.com\r\n\r\n") data = s.recv(1024) s.close() json_string = (somehow extract this) userdata = json.loads(json_string)
abarnert.. 5
执行此操作的简单方法是使用HTTP库.例如:
import json import urllib2 r = urllib2.urlopen("http://graph.facebook.com/{}/picture".format(id)) json_string = r.read() userdata = json.loads(json_string)
如果你真的想自己解析它,HTTP协议保证标题和正文由空行分隔,并且这将是响应中任何地方的第一个空行,所以它并不难:
data = s.recv(1024) header, _, json_string = data.partition('\r\n\r\n') userdata = json.loads(json_string)
这有一些明显的缺点 - 正如所写的那样,如果响应超过1K,你的代码将无法工作,或者如果内核没有在单个内容中提供整个响应recv
(它永远不能保证这样做),或者,如果服务器在真实响应之前重定向您或给您100 CONTINUE,或者服务器决定发回分块或MIME多部分或其他响应而不是扁平体,或者......
执行此操作的简单方法是使用HTTP库.例如:
import json import urllib2 r = urllib2.urlopen("http://graph.facebook.com/{}/picture".format(id)) json_string = r.read() userdata = json.loads(json_string)
如果你真的想自己解析它,HTTP协议保证标题和正文由空行分隔,并且这将是响应中任何地方的第一个空行,所以它并不难:
data = s.recv(1024) header, _, json_string = data.partition('\r\n\r\n') userdata = json.loads(json_string)
这有一些明显的缺点 - 正如所写的那样,如果响应超过1K,你的代码将无法工作,或者如果内核没有在单个内容中提供整个响应recv
(它永远不能保证这样做),或者,如果服务器在真实响应之前重定向您或给您100 CONTINUE,或者服务器决定发回分块或MIME多部分或其他响应而不是扁平体,或者......