通过 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 消息的主要内容,如果未能解决你的问题,请参考以下文章

RSA加密算法原理

如何通过其他节点在CAN总线上确认传输CAN消息?

[基础]同步消息和异步消息传递的区别?

ActiveMQ实例1--简单的发送和接收消息

在 Receiver 应用中发送和接收 JSON 消息时,发送者 ID 来自哪里?

C#基于UDP实现简单客户端和服务器消息发送和接收