通过 HTTP 发送和接收简单的 JSON 消息
Posted
技术标签:
【中文标题】通过 HTTP 发送和接收简单的 JSON 消息【英文标题】:Send and receive simple JSON message over HTTP 【发布时间】:2019-09-28 16:54:47 【问题描述】:我想通过 HTTP 发送和接收一些简单的数据。
这是服务器端:
import time
import BaseHTTPServer
import json
HOST_NAME = 'localhost'
PORT_NUMBER = 9000
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_POST(self):
print "You've got mail!"
content_len = int(self.headers.getheader('content-length', 0))
body = self.rfile.read(content_len)
data = json.loads(body)
print data
if __name__ == '__main__':
server_class = BaseHTTPServer.HTTPServer
httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME,
PORT_NUMBER)
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()
print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)
这是客户端:
import requests
import json
url = 'http://localhost:9000'
data =
'date': 'the best day',
'time': 'the best time',
'name': 'Janet Smith'
r = requests.post(url, json=data)
print r.status_code
print r.json()
我收到此错误:
Traceback(最近一次调用最后一次): 文件“testSend.py”,第 17 行,在
r = requests.post(url, json=data)
文件“/Library/Python/2.7/site-packages/requests/api.py”,第 116 行,在帖子中 返回请求('post', url, data=data, json=json, **kwargs)
文件“/Library/Python/2.7/site-packages/requests/api.py”,第 60 行,在请求中
返回 session.request(method=method, url=url, **kwargs)
文件“/Library/Python/2.7/site-packages/requests/sessions.py”,第 524 行,在请求中
resp = self.send(prep, **send_kwargs)
文件“/Library/Python/2.7/site-packages/requests/sessions.py”,第 637 行,在发送中
r = adapter.send(request, **kwargs)
文件“/Library/Python/2.7/site-packages/requests/adapters.py”,第 498 行,在发送中
引发 ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.',
BadStatusLine("''",))
编辑: 我最初也遇到了服务器端错误,但看起来问题可能与粘贴的代码行有关。我重新缩进了所有内容,现在它可以工作了。
【问题讨论】:
NameError: name 'self' is not defined
此代码不应该出现该错误。您确定您已正确发布代码吗?
客户端错误很明显——服务器没有运行,所以客户端无法连接。
@JohnGordon 肯定代码已发布。你能帮我理解客户端错误吗?当我能够运行服务器时,我得到了同样的错误(注释掉导致服务器端错误的代码)。
【参考方案1】:
原来有几个问题:
服务器端错误是由于复制粘贴代码。我需要重新缩进所有内容。
通过在服务器端的 DO_POST 函数中添加 self.send_response(200) 修复了客户端错误
执行 #2 会引入新的“无法解码 json”错误。这是因为来自服务器的响应不包含 json 消息。所以我只需要注释掉 print r.json() 行或者在服务器端发送一条 json 消息。
【讨论】:
以上是关于通过 HTTP 发送和接收简单的 JSON 消息的主要内容,如果未能解决你的问题,请参考以下文章