使用 PostAsync 时无内容 post JSON

No content when using PostAsync to post JSON

使用下面的代码,我成功地创建了一个具有以下格式的 jsonArray:[{"id":3},{"id":4},{"id":5}]

var jArray = new JsonArray();
        int numOfChildren = 10;
        for (int i = 0; i < numOfChildren; i++)
        {
            if (CONDITION == true)
            {
                var jObj = new JsonObject();
                int id = SOMEID;
                jObj.SetNamedValue("id", JsonValue.CreateNumberValue(id));
                jArray.Add(jObj);
            }

我现在正尝试使用 PostAsync 将 "JsonArray" 发送到服务器,如下所示:

Uri posturi = new Uri("http://MYURI");
HttpContent content = new StringContent(jArray.ToString(), Encoding.UTF8, "application/json");
System.Net.Http.HttpResponseMessage response = await client.PostAsync(postUri, content);

虽然在服务器端,我可以看到 post 请求不包含任何内容。在互联网上四处挖掘之后,似乎在 StringContent 中使用 jArray.ToString() 是罪魁祸首,但我不明白为什么或者如果这首先是问题。那么,为什么我的内容不见了?请注意,我正在为不使用 JSON.net 的 UWP 应用程序编写此代码。

您应该使用序列化程序将其转换为字符串。 使用 NewtonSoft JSON Nuget。

string str = JsonConvert.SerializeObject(jArray);
HttpContent content = new StringContent(str, Encoding.UTF8, "application/json");
System.Net.Http.HttpResponseMessage response = await client.PostAsync(postUri, content);

经过大量挖掘,我最终用 Wireshark 连接了两个不同的应用程序,一个使用我原来的 jArray.ToString(),另一个使用 JSON.net 的 JsonConver.SerializeObject()。在 Wireshark 中,我可以看到两个数据包的内容相同,这告诉我我的问题出在服务器端。我最终发现我的 PHP 脚本处理传入的 POST 请求过于直白,只接受 json 类型 'application/json' 的帖子。我的 UWP 应用程序发送了 'application/json; charset=utf-8' 类型的数据包。在服务器端稍微放松一些内容检查后,一切都很好。

对于那些希望在不使用 JSON.net 的情况下序列化 json 的人来说,jsonArray.ToString() 或 jsonArray.Stringify() 都很好。