如何使用请求编码 :null 在 flutter POST 中发送二进制加密数据? ;它在节点 js 中正常工作

How to send Binary encrypted data in flutter POST with request encoding :null ? ; which is working in node js properly

根据 node.js 文档编码:当二进制数据通过 Api、

发送时为 null

https://www.npmjs.com/package/request 在此 link 中找到下面提到的解释。

encoding - encoding to be used on setEncoding of response data. If null, the body is returned as a Buffer. Anything else (including the default value of undefined) will be passed as the encoding parameter to toString() (meaning this is effectively utf8 by default).

Note: if you expect binary data, you should set encoding: null.

现在我在 flutter/dart 中实现了同样的事情,并且此编码参数不接受 null,正如他们在 node.js 中提到的那样。

我想知道如何从 Flutter/dart 或至少 android/java.

提出同样的 Post 请求
var enc = AESCrypt.encrypt(key, iv, JSON.stringify(obj_j));

var output = new Buffer.from(enc, 'hex'); // Buffer 

function test() {
    console.time("XXX");
    request.post({
   
        headers: {
            'content-type': 'application/json'
        },  //required, or webserver will ignore it application/json  multipart/form-data
        url: 'http://192.168.29.210/deviceid/read', // webserver url
        encoding:null,
        body: output
    },
    function (error, response, body) {
        
        if (!error && response.statusCode == 200) {
             console.timeEnd("XXX");
           
            body = AESCrypt.decrypt(key, iv, body);
             //body is decrypted http response, can be parsed with json method
            fs.writeFile('input.json', body, function (err) {
                if (err) {
                    return console.error(err);
                }
            });
        }
    });

};

添加我在 flutter 中尝试过的代码

    var headers = {'Content-Type': 'application/json'};

    var request =
        http.Request('POST', Uri.parse('http://192.168.29.210/deviceid/read'));
    request.body = encryptedText;
    request.encoding = null ; // here this null parameter is not acceptable 
    request.encoding = Encoding.getByName("utf-8")); // only this option is available to add in flutter 
    request.headers.addAll(headers);

    http.StreamedResponse response = await request.send();

即使在 post man 中也没有设置此编码变量。

使用下面的flutter框架方法

Future<Response> post(Uri url,
    {Map<String, String>? headers, Object? body, Encoding? encoding}) =>
_withClient((client) =>
    client.post(url, headers: headers, body: body, encoding: encoding));

如何使用

  final url = Uri.parse('$urlPrefix/posts');
  final headers = {"Content-type": "application/json"};
  final json = '{"title": "Hello", "body": "body text", "userId": 1}';
  final response = await post(url, headers: headers, body: json,encoding:null);  //here this null parameter is not acceptable 

我的最终工作代码是

var headers = {'Content-Type': 'application/json'};

    final response = await http.post(
        Uri.parse('http://192.168.29.210/deviceid/read'),
        headers: headers,
        body: encryptedText,
        encoding: null);
    if (response.statusCode == 200) {
      String res = response.body.toString();
      //String data = AesEncryption().decryption(res);
      print('Body: ${response.body.toString()}');
    } else {
      print(response.reasonPhrase);
    }
    print('Status code: ${response.statusCode}');