背景:
server: python http.server 见 https://blog.csdn.net/a1368783069/article/details/87359881
client : node.js request
client 在请求 server时,返回结果解析错误。
server.py
import json
import http.server
import socketserver
from urllib.parse import urlparse, parse_qs
PORT = 7700
class HandleServer(http.server.BaseHTTPRequestHandler):
def do_GET(self):
print(self.client_address)
print(self.headers)
query = urlparse(self.path)
returncode, msg = 0, "success"
if query.path.strip("/") == urlparse("/parse/").path.strip("/") :
params = parse_qs(query.query)
q = params("q",[""])[0]
else:
returncode, msg = 1000, "url path should be parse"
output = {"returncode": returncode, "message": msg}
self.wfile.write(json.dumps(output).encode("utf-8"))
handler = HandleServer
with socketserver.TCPServer(("", PORT), handler) as httpd:
print("server starting..", PORT)
httpd.serve_forever()
client.js
var request = require('request');
var qs = require('querystring')
var tempData = "test"
var data = qs.stringify({q: tempData })
request({
url: 'http://127.0.0.1:7700/parse?' +data,
method: 'GET',
}, function(error, resp, body){
console.log(error);
console.log(resp)
console.log(body);
});
启动服务 python3 server.py
执行请求 node client.js
然后就报错 :
{ Error: socket hang up
at createHangUpError (_http_client.js:313:15)
at Socket.socketOnEnd (_http_client.js:416:23)
at Socket.emit (events.js:187:15)
at endReadableNT (_stream_readable.js:1090:12)
at process._tickCallback (internal/process/next_tick.js:63:19) code: 'ECONNRESET' }
根据查到的资料,是由于 server 再返回的数据头部 : Content-type 为 json。 应该改为: text/html
即,在server.py 中的 self.wfile.write 这行前面加上:
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
同时, Content-type
的开头为大写, 而不是 content-type 。
参考资料:
http server. empty reply on GET request with not url encoded GET-param #6295
https://github.com/nodejs/node/issues/6295