簡體   English   中英

Python從HTTP響應中提取JSON

[英]Python Extract JSON from HTTP Response

說我有以下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)

最簡單的方法是使用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多重響應或其他響應,而不是扁平體,或者…

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM