HttpWebRequest, Как отправить данные POST с типом содержимого приложения / JSON? - PullRequest
6 голосов
/ 13 июня 2011
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";

Данные POST были отправлены (я проверяю с помощью Fiddler), возвращенные из Yahoo:

{"error": {"code": - 1003, "detail": "Неподдерживаемый тип содержимогоОшибка "," описание ":" Ошибка неподдерживаемого типа контента "}," код ": - 1003}

Я пишу клиент Yahoo Messanger, для которого требуется application / json;charset = utf-8 в качестве типа контента, и когда я установил:

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

Нет данных POST, отправленных из Yahoo:

{"error": {"code": - 1005, "detail": "Invalid Argument Error", "description": "Invalid Argument Error"}, "code": - 1005}

UPDATE

Я пытался отправить эти 2 значения методом POST: senceState & status .

Как указано в Yahoo Messager IMAPI поддерживается content-type являются application / json .И в моем коде, если я установил content-type в application / json , HttpWebRequest не отправлял эти 2 значения через POST.

Ответы [ 5 ]

2 голосов
/ 18 августа 2012

Взгляните на следующий пример

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();
    }
}
0 голосов
/ 10 мая 2018

Я супер опоздал на вечеринку, но я оказался здесь, пытаясь выяснить, что я испортил, так что, возможно, это поможет кому-то еще.

Если в своем коде c # вы задали тип контента, а затем добавили некоторые другие заголовки - примерно так:

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

, что на самом деле происходит, когда вы пишете в .ContentType,под капотом он устанавливает Content-Type в WebHeaderCollection вашего запроса.И тогда вы идете вперед и перезаписать их.Это может произойти с любым заголовком, который вы установили таким образом, прежде чем добавлять несколько пользовательских.Если это то, что вы делаете, сначала установите пользовательские заголовки, а затем запишите в .Whichever заголовки.

0 голосов
/ 19 сентября 2012

я боролся с точно такой же проблемой. как указано в документации (http://developer.yahoo.com/messenger/guide/ch01s04.html),, в запросе POST необходимо указать пустое тело ({}).

используя javascript и 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)')
        }});

надеюсь, это поможет.

0 голосов
/ 22 июня 2011

Моя ошибка, возможно, такая же, как ваша ошибка. Проблема решается изменением типа presenceState на тип int, а не на тип строки.

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

Я надеюсь, что вы решите это.

0 голосов
/ 13 июня 2011

Исходя из вашей ошибки, первая ошибка дает сбой, поскольку тип содержимого запроса не соответствует тому, что ожидает Yahoo. Это имеет смысл, и ваш второй пример идет по правильному пути, но на основании ваших публикаций кажется, что вы получаете ответ. С Fiddler вы сможете сравнить ваши сообщения с соответствующим запросом через сайт. Это может помочь точно определить, где происходит ошибка.

Но независимо от того, что нам нужно будет увидеть чуть больше того, что вы делаете, поскольку ничто не отображает содержание вашего поста, чтобы мы могли его просмотреть.

...