【问题标题】:C# - Can't send HTTP Post Request with valid JSONC# - 无法使用有效 JSON 发送 HTTP Post 请求
【发布时间】:2014-01-16 01:59:51
【问题描述】:

我有 .Net 4.0。

我正在尝试向 Web 服务(我无法控制)发送带有标头和数据的 http POST 请求,但我收到 500 内部服务器错误。网络服务向手机发送短信 - 我有一个通过他们的网站成功测试过的帐户,所以我知道我的“联系人列表”是有效的

他们的 API 文档要求如下:

标题:内容类型:应用程序/json

数据:例如,要将消息“Testing”发送到联系人 ID“1111”,您将 POST:

{
"contacts": [1111],

"text": "Testing"
}

这是我返回 500 错误的代码:

        WebRequest MessageRequest;
        WebResponse MessageResponse;
        JavaScriptSerializer jsSer = new JavaScriptSerializer();
        object JSONSerialized = new object();
        string jsonString = @"{ ""contacts"":""ValidNumber"",""text"":""test text""}";

        JSONSerialized = jsSer.Serialize(jsonString);
        MessageRequest = WebRequest.Create(URL);
        MessageRequest.Method = "POST";
        MessageRequest.ContentType = "application/json";

        using (var strWrt = new StreamWriter(MessageRequest.GetRequestStream()))
        {
            strWrt.Write(JSONSerialized);
            strWrt.Close();
        }

        MessageResponse = MessageRequest.GetResponse();
        //^^^This is the line that throws the 500 error.

        return MessageResponse;
    }

关于他们请求的格式。我试过了

我在 Write() 和 Close() 之间尝试了 strWrt.Flush(),但仍然出现 500 错误。

我尝试将 json 构建为字典,使用 strWrt.Write() 将字符串作为字节数组发送,除此之外我还看到了一些建议,但所有这些都导致了 400 Bad Request 错误。

另外,我尝试了许多格式化数据的变体。我意识到这个例子在电话号码周围有引号,并且没有他们文档中描述的括号,但是我已经尝试了所有这些组合并且总是得到 500 错误,所以我猜测我要么没有正确地将字符串转换为 json 对象,要么没有将 json 对象正确地传递给 MessageRequest - 或两者兼而有之。我发现的大多数解决方案都使用 .Net 4.5 对象,不幸的是,Web 服务的支持根本没有帮助 - 他们只是说“看起来你没有发送有效的 json”

我已经坚持了一周 - 任何帮助都会非常感激。感谢您的宝贵时间。

更新:

我改用另一个在我第一次尝试时工作的 SMS API。尽管建议的解决方案都不适用于这个问题,但这对我来说不再重要了,尽管我有点好奇为什么它从来没有奏效。

【问题讨论】:

  • fiddler (fiddler2.com) 告诉你什么正在走线?对于这种代码,我通常会使用 RestSharp,但我记得 JavaScriptSerializer 需要一个具有与属性名称匹配的公共属性的 DTO。

标签: c# json


【解决方案1】:

我认为您可能在 API 定义中遗漏了您提供的联系人作为数字数组传入的内容

{ "contacts": [1234, 4321], "text": "hello" }

而不是单个字符串值

{ "contacts": "1234", "text": "hello" }

【讨论】:

    【解决方案2】:

    例如,您需要将数组中的元素(甚至只是一个)包含在 [ ] 之间

    {
      "contacts":[{1111}], "text":"msg here"
    }
    

    【讨论】:

    • 谢谢 - 我如何将它传递给消息请求?我尝试了一个带有 uint[] 名为 contacts 和一个字符串名为 text 的对象,但出现 400 错误。我还尝试了一个具有两个键值对()的对象,命名为联系人和文本,但也出现 400 错误。
    【解决方案3】:

    当您已经序列化对象时,我不明白为什么还需要JavaScriptSerializer?为什么不按原样通过呢?现在看来您正在尝试将某个对象序列化两次。试试下面的代码:

        WebRequest MessageRequest;
        WebResponse MessageResponse;
        string jsonString = @"{ ""contacts"":""ValidNumber"",""text"":""test text""}";
    
        MessageRequest = WebRequest.Create(URL);
        MessageRequest.Method = "POST";
        MessageRequest.ContentType = "application/json";
    
        using (var strWrt = new StreamWriter(MessageRequest.GetRequestStream()))
        {
            strWrt.Write(jsonString);
            strWrt.Close();
        }
    
        MessageResponse = MessageRequest.GetResponse();
    
        return MessageResponse;
    

    【讨论】:

    • 我试过这段代码,它会抛出 400 Bad Request 错误,
    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2013-02-27
    相关资源
    最近更新 更多