Estou tendo problemas para postar json em um pequeno servidor http node.js. Os dados de postagem sempre parecem ter um "indefinido" na frente. Provavelmente estou sendo realmente estúpido, então peço desculpas!
Inicio o servidor e posto algum json com o script py abaixo:
>>node simplehttp.js
>>python post.py "{"foo":"bar"}"
O servidor recebe isso
>>Request received: undefined{"foo": "bar"}
Invalid JSON:undefined{"foo": "bar"}
servidor http do nó
var http = require("http"); // http-server
var server_http = http.createServer(
// Function to handle http:post requests, need two parts to it
// http://jnjnjn.com/113/node-js-for-noobs-grabbing-post-content/
function onRequest(request, response) {
request.setEncoding("utf8");
request.addListener("data", function(chunk) {
request.content += chunk;
});
request.addListener("end", function() {
console.log("Request received: "+request.content);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Thanks for sending a message");
response.end();
try {
json = JSON.parse(request.content);
if(json.m !== undefined){
console.log("m: "+json.m);
}
} catch (Error) {
console.log("Invalid JSON:" + request.content);
}
});
}
);
server_http.listen(9002);
script python para fazer post
import sys
import json
import httplib, urllib, urllib2
# Get parameters
if len(sys.argv) < 2:
sys.stderr.write("Usage: python post.py [JSON Message]n")
sys.exit(1)
values = json.loads(sys.argv[1])
headers = {"Content-type": "application/json"}
conn = httplib.HTTPConnection("127.0.0.1", 9002)
headers = {"Content-type": "application/json"}
conn.request("POST", "", json.dumps(values), headers)
response = conn.getresponse()
print "response.status: "+response.status
print "response.reason: "+response.reason
print "response.read: "+response.read()
conn.close()
Respostas:
3 para resposta № 1Você precisa definir o valor inicial de content
:
function onRequest(request, response) {
request.content = "";
Na primeira chamada para o data
evento, request.content
ainda não existe. A representação em string de uma propriedade indefinida é "undefined"
.
Então, para ilustrar o mecanismo por trás request.content += chunk;
:
request.content += chunk; // is equivalent to
request.content = request.content + chunk; // but request.content is undefined
request.content = undefined + chunk; // String concatenation, so
request.content = "undefined" + chunk; // <-- This
// Example, chunk = "{}" --> request.content = "undefined{}"
// After this step, `request.content` is defined, and future calls to
// request.content += chunk; are plain string concatenations.