HttpWebRequest,如何使用Application / JSON Content-Type发送POST数据?

时间:2011-06-12 23:55:49

标签: c# httpwebrequest yahoo-messenger

HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";

从Yahoo返回的POST数据(我使用Fiddler检查):

{“error”:{“code”: - 1003,“detail”:“不支持的内容类型错误”,“说明”:“不支持的内容类型错误”},“代码”: - 1003}

我正在编写需要 application / json的Yahoo Messanger客户端; charset = utf-8 作为内容类型,当我设置:

request.ContentType = "application/json; charset=utf-8";

从Yahoo返回没有POST数据发送:

{“error”:{“code”: - 1005,“detail”:“无效的参数错误”,“description”:“无效的参数错误”},“code”: - 1005}

更新

我尝试通过POST方法发送这两个值: presenceState &的状态

Yahoo Messager IM API中所述内容类型 application / json 。 在我的代码中,如果我将内容类型设置为 application / json ,则 HttpWebRequest 不会通过POST发送这两个值。

5 个答案:

答案 0 :(得分:2)

看看以下示例

byte[] data = CreateData(value);
var requst = (HttpWebRequest) WebRequest.Create(uri);
requst.Method = "POST";
requst.ContentType = "application/json";
requst.ContentLength = data.Length;
using (Stream stream = requst.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

CreateData

的位置
public static byte[] Create<T>(T value)
{
    var serializer = new DataContractJsonSerializer(typeof (T));
    using (var stream = new MemoryStream())
    {
        serializer.WriteObject(stream, value);
        return stream.ToArray();
    }
}

答案 1 :(得分:0)

根据您的错误,第一个失败,因为请求的内容类型与Yahoo期望的内容类型不匹配。这是有道理的,你的第二个例子是走向正确的道路,但根据你的帖子,你似乎得到了回应。使用提琴手,您应该能够通过网站将您的帖子与正确的请求进行比较。这可能有助于找出出错的地方。

但是,无论我们需要多看一些您正在做的事情,因为没有任何内容显示您帖子的内容供我们审核。

答案 2 :(得分:0)

我正在努力解决同样的问题。 如文档(http://developer.yahoo.com/messenger/guide/ch01s04.html)中所述,您需要在POST请求中有一个空主体({})。

使用javascript&amp; jQuery,我在POST主体中发送了一个简单的空对象字符串,并且有效:

    $.ajax({
        type: 'POST',
        url: 'http://developer.messenger.yahooapis.com/v1/session',
        data: JSON.stringify({ }),
        processData: false,
        beforeSend: function(xhr) {
            xhr.setRequestHeader('Authorization', OAuth.getAuthorizationHeader("yahooapis.com", message.parameters));
            xhr.setRequestHeader('Content-Type','application/json; charset=UTF-8');
            xhr.setRequestHeader('X-Yahoo-Msgr-User-Agent','YahooMessenger/1.0 (yourapp; 1.0.0.1)')
        }});
希望有所帮助。

答案 3 :(得分:0)

我在派对上已经很晚了,但我最终在这里想弄清楚我搞砸了什么,所以也许这会帮助别人。

如果在您的c#代码中设置内容类型,然后添加其他标题 - 如下所示:

httpWebRequest.ContentType = @"application/json; charset=utf-8";        
WebHeaderCollection headers = new WebHeaderCollection();
headers.Add("Authorization", "Bearer "+oAuthBearerToken);
httpWebRequest.Headers = headers;

实际发生的是,当你写入.ContentType时,它会在你的请求的WebHeaderCollection中设置Content-Type。然后你继续并覆盖它们。在添加一堆自定义标头之前,这可能会发生在您设置的任何标头上。如果您正在执行此操作,请先设置自定义标头,然后写入.Whichever标头。

答案 4 :(得分:-1)

我的错误可能与您的错误相同。通过将presenceState的更改类型更改为int类型而不是字符串类型来解决此问题。

ClassLogon objLogon = new ClassLogon
  {
    presenceState = ***0***,
    presenceMessage = "I am logn"
  };

我希望你解决这个问题。