C# - 无法使用有效的JSON发送HTTP Post请求

时间:2014-01-16 01:59:51

标签: c# json

我有.Net 4.0。

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

他们的API文档需要以下内容:

标题:内容类型:application / json

数据:例如,要将“测试”消息发送到联系人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构建为Dictionary,将字符串作为带有strWrt.Write()的字节数组发送,以及我见过的其他建议,但所有这些都导致400 Bad Request错误。

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

我已经坚持了一个星期 - 任何帮助都会非常赞赏。谢谢你的时间。

更新

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为您可能错过了您提供的API定义,即联系人以数字数组的形式传递

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

而不是单个字符串值

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

答案 2 :(得分:0)

我无法理解为什么在已经序列化对象时需要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;