[几天前,我发现发布带有“ Content-Type”:“ application / x-www-form-urlencoded”的数据不会让我发送ñ,ç,á,é,í,ó, ú和某些语言中使用的其他非ASCII。它返回了[ERR_INVALID_CHAR]。
[稍微搜索一下,我发现为了发布大量数据和非ASCII字符,我应该使用“ Content-Type”:“ multipart / form-data”(基本上是表单)。
因此,由于我发布的信息未收集在模板表单中,因此我必须直接在node.js服务器应用程序的函数中构建表单数据对象。这是我的node.js代码:
const formData = require('form-data');
const https = require('https');
const form = new formData();
form.append('name', 'ñámeç');
let options = {
hostname: 'dev.mydomain.com',
path: '/processdata',
method: 'POST',
headers: form.getHeaders()
}
let req = https.request(options, res=>{
console.log(res.statusCode);
res.on('data', function(chunk){
console.log(''+chunk);
});
res.on('end', function(){
console.log('end');
});
});
req.on('error',function(e){
console.log(e);
})
form.pipe(req);
然后,在dev.mydomain.com/processdata中的API是在Symfony5中构建的。从“ Content-Type”:“ application / x-www-form-urlencoded”更改为“ Content-Type”:“ multipart / form-data”之前,代码是:
public function processdata(Request $request)
{
// Get post data
$json = $request->get('json', null);
// Json decode data
$guest = json_decode($json);
... DO SOME STUFF ...
$data = "RESULTING STRING";
return new JsonResponse($data);
}
我将其更改为:
public function processData(Request $request)
{
// This is how I expected it would be:
var_dump($request->request->get('name'));
// This is just in case it was arriving as GET instead of POST (yes, I'm desperate):
var_dump($request->query->get('name'));
// This is just in case it was arriving as a form object.
var_dump($request->query->get('form')['name']);
// This is also a desperate test, but I found some forums pointing this out:
var_dump($request->get('name'));
// Trying to print the request contents:
print_r($request->request);
// Since all the $request calls in the var_dumps returned NULL or EMPTY data, I forced the enpoint to return a string to make sure I had a response.
// Forcing a string for the callback:
$data = "FORCED RESULTING STRING";
return new JsonResponse($data);
}
然后运行我的node.js应用程序,输出为:
Claire:Test claire$ node test.js
200
NULL
NULL
NULL
NULL
Symfony\Component\HttpFoundation\ParameterBag Object
(
[parameters:protected] => Array
(
)
)
"FORCED RESULTING STRING"
end
[谁能救我吗?我已经在这里停留了几天。我在stackoverflow中还能读到的所有内容都不适用于我的情况,或者我只是没有意识到区别。
如果我缺少任何数据,可能需要我澄清一下,请告诉我。
非常感谢,希望大家都安全健康。
感谢您的回复,@ qdequippe !!我不确定,但是您照亮了我的路!
我再次检查了form-data npm docs,显然,form.getHeaders()
仅设置了multipart / form-data标头。
我记得Symfony需要设置Content-Length标头。否则,发布的数据将为NULL。
然后,我尝试再次使用form.submit()(我之前做过,但显然我做得不好),它为我设置了Content-Length。魔术完成了:
const formData = require('form-data');
const https = require('https');
const form = new formData();
form.append('name', 'ñámeç');
form.submit('https://dev.mydomain.com/processdata', function(err,res){
console.log(res.statusCode);
res.on('data', function(chunk){
console.log(''+chunk);
});
res.on('end', function(){
console.log('end');
});
res.resume();
});
它返回:
Claire:Test claire$ node test.js
200
string(8) "ñámeç"
NULL
NULL
string(8) "ñámeç"
Symfony\Component\HttpFoundation\ParameterBag Object
(
[parameters:protected] => Array
(
[name] => ñámeç
)
)
"FORCED RESULTING STRING"
end
$$ quest-> request-> get('name')立即捕获“名称”发布字段。
我不确定现在如何进行。我应该将回复标记为有效吗?也许您可以创建一个回复,以便我可以标记您的@qdequippe !!!非常感谢!祝你有美好的一天!