使用HTTPRequest在JSON中发送变音符

本文关键字:音符 HTTPRequest JSON 使用 | 更新日期: 2023-09-27 18:02:07

我正在尝试使用POST发送JSON字符串到运行在Azure上的web服务。该程序是用Xamarin Forms创建的应用程序。JSON通信与服务器基本上工作,但我有问题与变音符。

我有一个类"Test"

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

,我试图将其序列化为字符串。我使用JsonConvert:

string postData = JsonConvert.SerializeObject(test);

结果为{"ä":"ä"}。

当我发送这个字符串时,我得到一个400 Bad Request错误消息。

有趣的是,使用Firefox插件"打开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
}

使用HTTPRequest在JSON中发送变音符

嗯,这一行有问题:

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

从byteArray中上传字节并将其作为字符计数。但是单个字符(特别是变音符号)可以映射到两个字节。在您的示例中,byteArray。长度= 11,和postData。长度= 9。这就是为什么发送缩短版的postData而服务器无法处理它的原因。

用下面的字符串替换上面提到的字符串,一切正常:

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