FormatException Неверный заголовок HTTP Flutter на iOS - PullRequest
0 голосов
/ 24 мая 2019

Этот код отлично работает на Android-устройстве и эмуляторе.На эмуляторе iOS не работает.

Я пытаюсь изменить строку на строчные, убрать пробелы и т. Д., Ничего не решается.

import 'package:http/http.dart' show Client;
...
Map<String,String> headers = Map();
headers['device'] = 'appleiphonexʀ';//'Apple-iPhone-Xʀ'//'Apple_iPhone_Xʀ'//'Apple iPhone Xʀ'
...
var response = await client.get(Uri.parse(url), headers: headers);
return await processResponse(response);

Исключения:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: FormatException: Invalid HTTP header field value: "appleiphonexʀ"
  _HttpHeaders._validateValue (dart:_http/http_headers.dart:601:9)
  _HttpHeaders._addAll (dart:_http/http_headers.dart:65:18)
  _HttpHeaders.set (dart:_http/http_headers.dart:76:5)
  IOClient.send.<anonymous closure> (package:http/src/io_client.dart:42:27)
  __CompactLinkedCustomHashMap&_HashFieldBase&MapMixin&_LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:367:8)
  IOClient.send (package:http/src/io_client.dart:41:23)
 < asynchronous suspension>
  BaseClient._sendUnstreamed (package:http/src/base_client.dart:169:38)
 < asynchronous suspension>
  BaseClient.post (package:http/src/base_client.dart:54:7)
  NetworkProvider.post (package:PROJECTXX/src/models/resources/network_provider.dart:24:22)
<asynchronous suspension>

Решено: см. Ответ

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Последний символ в вашем заголовке - это кодовая точка Unicode hex 0280 aka LATIN LETTER SMALL CAPITAL R. Согласно RFC 2616, заголовки HTTP должны включать только символы в ISO-8859-1, если они не закодированы в формате MIME, который может выглядеть как =?UTF-8?Q?=E2=9C=B0?=. Не могли бы вы вместо этого использовать нижний или верхний регистр ASCII R?

0 голосов
/ 24 мая 2019

Follow Комментарий Ричарда Хипа , проблема заключалась в последнем символе, эти данные получены из lib device_info: ^ 0.4.0 + 1

final DeviceInfoPlugin deviceInfoPlugin = new DeviceInfoPlugin();
PackageInfo packageInfo = await PackageInfo.fromPlatform();
...
var device = await deviceInfoPlugin.iosInfo.name;//Apple iPhone Xʀ
...
//the solution: remove non ascii chars and substitute for underline        
headers['device'] = device.replaceAll(new RegExp('[^\u0001-\u007F]'),'_');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...