2017-09-27 3 views
1

Ich mache Client-App und ich benutze HttpClient. Es sendet perfekt und erhält JSON mit lateinischen Symbolen, aber wenn ich versuche, JSON mit russischen Buchstaben zu senden (mit derselben Anfrageadresse und demselben Server), sendet es keine Anfragen an den Server. Hier ist der Code:HttpClient sendet keine Anfrage mit JSON mit russischen Zeichen

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

ich alle Nachrichten (111.222.333.444), aber dann bekomme ich nichts anderes. Hier ist das Beispiel von json:

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

Antwort

2

Das passiert wegen falscher contentLength. Standardmäßig ist der Inhalt UTF8-codiert. Also eigentlich Datenlänge! = Stringlänge. Wenn Sie eine Konsolenanwendung ausführen, wird eine Ausnahme ausgelöst.

Die Inhaltsgröße überschreitet die angegebene contentLength. 69 Bytes geschrieben, während 38. erwartet

So beste Lösung zu erhalten codierte Länge:

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