2015-07-10 3 views
0

Я пытаюсь отправить строку JSON с помощью POST на веб-службу, запущенную на Azure. Программа - приложение, созданное с помощью Xamarin Forms. Связь JSON с сервером в основном работает, но у меня проблемы с умляутами.Отправить umlauts в JSON, используя HTTPRequest

У меня есть класс «Тест»

public class Test 
{ 
    public string ä { get; set; }    
} 

, который я пытаюсь сериализовать в строку. Я использую JsonConvert для этого:

string postData = JsonConvert.SerializeObject(test); 

В результате получается {"ä": "ä"}.

Когда я отправляю эту строку, я получаю сообщение об ошибке 400 Bad Request.

Интересно, что отправка этой строки с использованием плагина Firefox «Open HttpRequester» отлично работает.

Смена первого умлаута на "ae" ({"ae": "ä"}) работает.

Здесь # код C Я использую для отправки строки:

private void Send() 
{ 
    Uri uri = new Uri(serverPath); 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
    request.Method = "POST"; 
    request.ContentType = "application/json"; 
    request.BeginGetRequestStream(new AsyncCallback(UploadWithRequestStream), request); 
} 

private void UploadWithRequestStream(IAsyncResult asynchronousResult) 
{ 
    Test test = new Test(); 
    test.ä = "ä"; 
    string postData = JsonConvert.SerializeObject(test); // {"ä":"ä"} 

    byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
    Stream uploadStream = request.EndGetRequestStream(asynchronousResult); 
    uploadStream.Write(byteArray, 0, postData.Length); 
    uploadStream.Flush(); 
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 
} 

private void GetResponseCallback(IAsyncResult asynchronousResult) 
{ 
    // 404 Bad Request 
} 
+0

попробовать 'request.ContentType = "Content-тип:/JSON, кодировка = UTF-8"' – phuzi

+0

Спасибо, но это Didn Помогите. – telandor

ответ

3

Ну, у вас есть проблемы в этой линии:

uploadStream.Write(byteArray, 0, postData.Length); 

Вы загружать байты из ByteArray, и сосчитать их символы. Но один символ (в частности, умляут) может отображаться на два байта. В вашем примере byteArray.Length = 11 и postData.Length = 9. Вот почему вы отправляете сокращенную версию postData и ее нельзя обрабатывать сервером.

Заменить указанную строку со строкой ниже, и все прекрасно:

uploadStream.Write(byteArray, 0, byteArray.Length); 
Смежные вопросы