简体   繁体   English

Flutter HTTP 请求发送使用 xml 主体

[英]Flutter HTTP request send using xml body

I'm trying to process a HTTP request in Flutter/Dart (in this case using the SEARCH method to filter some files on a WebDAV server (Nextcloud)) need to send XML data in the body of the request.我正在尝试在 Flutter/Dart 中处理 HTTP 请求(在这种情况下,使用 SEARCH 方法过滤 WebDAV 服务器(Nextcloud)上的一些文件)需要在请求正文中发送 XML 数据。

[x] Can execute the comand using cURL on terminal with the --data parameter: [x] 可以通过 --data 参数在终端上使用 cURL 执行命令:

curl -u user:pass -X SEARCH 'https://host123.com.br/remote.php/dav' -H "content-Type: text/xml" --data '<?xml version="1.0" encoding="UTF-8"?><d:searchrequest xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns"><d:basicsearch><d:select><d:prop><d:displayname/></d:prop></d:select><d:from><d:scope><d:href>/files/wprech</d:href><d:depth>infinity</d:depth></d:scope></d:from><d:where><d:and><d:or><d:eq><d:prop><d:getcontenttype/></d:prop><d:literal>image/png</d:literal></d:eq><d:eq><d:prop><d:getcontenttype/></d:prop><d:literal>image/jpg</d:literal></d:eq><d:eq><d:prop><d:getcontenttype/></d:prop><d:literal>video/mp4</d:literal></d:eq></d:or></d:and></d:where><d:orderby/></d:basicsearch></d:searchrequest>'

[x] Also works via Postman app: [x] 也可以通过 Postman 应用程序工作:

[ ] Can't do this request with xml body using Flutter/Dart. [ ] 无法使用 Flutter/Dart 对 xml 主体执行此请求。 All other HTTP requests of this project we used the DIO pkg, and it works fine, but the problem is.这个项目的所有其他 HTTP 请求我们使用了 DIO pkg,它工作正常,但问题是。 to send the xml body with it.与它一起发送 xml 主体。 The closest code is bellow:最接近的代码如下:

void _list() async {
final prefs = await SharedPreferences.getInstance();

var us = prefs.getString('id') ?? '';
var sn = prefs.getString('password') ?? '';

String basicAuth = 'Basic ' + base64Encode(utf8.encode('$us:$sn'));

try {
  Dio dio = new Dio();
  dio.options.method = 'SEARCH';
  dio.options.responseType = ResponseType.plain;
  dio.options.headers = {
    HttpHeaders.authorizationHeader: basicAuth,
    'content-Type': 'text/xml'
  };
  String data =
      '<?xml version="1.0" encoding="UTF-8"?><d:searchrequest xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns"><d:basicsearch><d:select><d:prop><d:displayname/></d:prop></d:select><d:from><d:scope><d:href>/files/wprech</d:href><d:depth>infinity</d:depth></d:scope></d:from><d:where><d:and><d:or><d:eq><d:prop><d:getcontenttype/></d:prop><d:literal>image/png</d:literal></d:eq><d:eq><d:prop><d:getcontenttype/></d:prop><d:literal>image/jpg</d:literal></d:eq><d:eq><d:prop><d:getcontenttype/></d:prop><d:literal>video/mp4</d:literal></d:eq></d:or></d:and></d:where><d:orderby/></d:basicsearch></d:searchrequest>';

  Response response = await dio.request(
      "https://host123.com.br/remote.php/dav",
      data: data);

  print(response);
} catch (e) {
  print(e);
}}

Server responses vary between 400, 404, 500 e 501, depending how it's sent:服务器响应在 400、404、500 和 501 之间变化,具体取决于它的发送方式:

I/flutter ( 6767): DioError [DioErrorType.RESPONSE]: Http status error [400]

Any help?有什么帮助吗? :) :)

Experiment with a simpler package:http version.尝试使用更简单的package:http版本。

import 'dart:convert';
import 'dart:io';

import 'package:http/http.dart' as http;

main() async {
  var username = 'foo';
  var password = 'B@r!';
  var credential = base64.encode(utf8.encode('$username:$password'));
  var client = http.IOClient();

  var request = http.Request(
    'SEARCH',
    Uri.parse('https://host123.com.br/remote.php/dav'),
  );
  request.headers.addAll({
    HttpHeaders.authorizationHeader: 'Basic $credential',
    'content-type': 'text/xml' // or text/xml;charset=utf-8
  });

  var xml = '<?xml version="1.0" encoding="UTF-8"?>...';
  // either
  request.body = xml;
  // which will encode the string to bytes, and modify the content-type header, adding the encoding
  // or
  // request.bodyBytes = utf8.encode(xml);
  // which gives you complete control over the character encoding

  var streamedResponse = await client.send(request);
  print(streamedResponse.statusCode);

  var responseBody =
      await streamedResponse.stream.transform(utf8.decoder).join();
  print(responseBody);
  client.close();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM