我正在尝试在Flutter / Dart中处理HTTP请求(在这种情况下,使用SEARCH方法来过滤WebDAV服务器(Nextcloud)上的某些文件)需要在请求主体中发送XML数据。
[x]可以在终端上使用带有--data参数的cURL执行comand:
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应用程序使用:
[]无法使用Flutter / Dart对xml主体执行此请求。 该项目的所有其他HTTP请求我们都使用了DIO pkg,它工作正常,但问题是。发送xml正文。最接近的代码如下:
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之间变化,具体取决于发送方式:
I/flutter ( 6767): DioError [DioErrorType.RESPONSE]: Http status error [400]
有帮助吗? :)
答案 0 :(得分:0)
使用更简单的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();
}