2017-09-27 3 views
1

Je crée une application client et j'utilise HttpClient. Il envoie et obtient json parfaitement avec des symboles latins, mais quand j'essaye d'envoyer json avec des lettres russes (avec la même adresse de demande et le même serveur), il n'envoie aucune requête au serveur. Voici le code:HttpClient n'envoie pas de requête avec json avec des caractères russes

class RestApiClientBase { 

    static String _server; 
    static String _ssid; 
    final HttpClient _client = new HttpClient(); 
    static const _codec = const JsonEncoder.withIndent(" "); 

    RestApiClientBase() { 
    _client.badCertificateCallback = 
     (X509Certificate cert, String host, int port) => true; //for self-signed cert 
    } 

    void setServer(String serverNew) { 
    _server = serverNew; 
    } 

    void setSsid(String ssidNew) { 
    _ssid = ssidNew; 
    } 

    dynamic invokePost(String method, String data) async { 
    return await _client.postUrl(Uri.parse(_server + method)) 
     .then((HttpClientRequest request) async { 
     //print('11111111111111111111111'); 
     request.headers.contentType 
     = new ContentType("application", "json", charset: "utf-8"); 
     //print('22222222222222222222222'); 
     request.contentLength = data.length; 
     //print('33333333333333333333333'); 
     request.write(data); 
     //print('44444444444444444444444'); 
     return await request.close(); 
    }) 
     .then((HttpClientResponse response) async { 
     if (response.statusCode == 200) { 
     return response 
      .transform(UTF8.decoder) 
      .single; 
     } else { 
     String errorJson = RestApiClientBase._codec.convert(
      { 
       "status": "error", 
       "message": "Error code: ${response.statusCode}" 
      }); 
     return errorJson; 
     } 
    }).then((String answer) async { 
     var json = JSON.decode(answer); 
     rState.setRState(method, json["status"], json["message"]); 
     return json; 
    }); 
    } 
} 
class SecurityGroupClient extends RestApiClientBase { 
    dynamic getSGroups() async { 
    String json = RestApiClientBase._codec.convert(
     {"ssid": RestApiClientBase._ssid}); 
    return await invokePost("sgroup/list", json); 
    } 

    dynamic createSGroup(String name, String info) async { 
    String json = RestApiClientBase._codec.convert(
     {"ssid": RestApiClientBase._ssid, "name": name, "info": info}); 
    print(json); 
    return await invokePost("sgroup/create", json); 
    } 
} 

Je reçois tous les messages (111,222,333,444), mais je ne reçois rien d'autre. Voici l'exemple de JSON:

{
"ssid": "6a3b1d12-cd4d-4962-ae06-34d36e31ac7e",
"name": "Тестовая группа на русском",
« info ":" тест "
} Le serveur utilise https.

Répondre

2

Cela se produit en raison d'une longueur de contenu incorrecte. Par défaut, le contenu est codé en UTF8. Donc, en fait, la longueur des données! = Longueur de la chaîne. Si vous exécutez une application de console, une exception est émise

La taille du contenu dépasse le contenu spécifiéLength. 69 octets écrits en attendus 38.

donc la meilleure solution pour obtenir la longueur est codée:

request.contentLength = UTF8.encode(data).length;