发布到symfony端点的Node.js表单数据为NULL

问题描述 投票:0回答:1

[几天前,我发现发布带有“ 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中还能读到的所有内容都不适用于我的情况,或者我只是没有意识到区别。

如果我缺少任何数据,可能需要我澄清一下,请告诉我。

非常感谢,希望大家都安全健康。

node.js symfony post null request
1个回答
0
投票

感谢您的回复,@ 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 !!!非常感谢!祝你有美好的一天!

© www.soinside.com 2019 - 2024. All rights reserved.