Flutter HTTP请求使用xml正文发送 [英] Flutter HTTP request send using xml body

查看:141
本文介绍了Flutter HTTP请求使用xml正文发送的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Flutter/Dart中处理HTTP请求(在这种情况下,使用SEARCH方法来过滤WebDAV服务器(Nextcloud)上的某些文件)需要在请求的正文中发送XML数据.

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.

[x]可以使用--data参数在终端上使用cURL执行comand:

[x] Can execute the comand using cURL on terminal with the --data parameter:

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]也可以通过Postman应用程序使用:

[x] Also works via Postman app:

[]无法使用Flutter/Dart使用xml正文执行此请求. 该项目的所有其他HTTP请求我们都使用了DIO pkg,它工作正常,但问题是.发送xml正文.最接近的代码是下面的代码:

[ ] Can't do this request with xml body using Flutter/Dart. All other HTTP requests of this project we used the DIO pkg, and it works fine, but the problem is. to send the xml body with it. 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);
}}

服务器响应在400、404、500和501之间变化,具体取决于发送方式:

Server responses vary between 400, 404, 500 e 501, depending how it's sent:

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

有帮助吗? :)

推荐答案

使用更简单的package:http版本的实验.

Experiment with a simpler package:http version.

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();
}

这篇关于Flutter HTTP请求使用xml正文发送的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆