Пример DotNetOpenAuth POST с телом JSON - PullRequest
4 голосов
/ 31 мая 2011

Я использую DotNetOpenAuth и пытаюсь опубликовать объект JSON на сервере.

Сервер выдает ошибку WebContentType = Raw.

Authorization: OAuth
oauth_token="V9vVXD51ehUU6WmY%2FQ41qta0RfY%3D",oauth_consumer_key="CHiawRiAb299cOas",oauth_nonce="BBTM4csg",oauth_signature_method="HMAC-SHA1",oauth_signature="KZJZvT630f2KenB9l9tqSLI%2FfHA%3D",oauth_version="1.0",oauth_timestamp="1306870331"
Content-Type: application/x-www-form-urlencoded; charset=utf-8 
User-Agent: DotNetOpenAuth/3.4.6.10357

Полагаю, я действительно ищу пример того, как это сделать? Или URL к образцу?

Я сейчас пытаюсь

WebRequest httpRequest = consumer.
    PrepareAuthorizedRequest(endpoint, AccessToken, para);
httpRequest.ContentType = "application/json";
WebResponse webResponse = httpRequest.GetResponse();

Ответы [ 3 ]

3 голосов
/ 20 февраля 2013

Первоначально ответил iain :

Хорошо, мне удалось это решить. Проблема, которую я обнаружил, заключается в том, что я вызывал PrepareAuthorizedRequest из ConsumerBase. Тип содержимого после этого не учитывается и всегда помечается как x-www-form-urlencoded. Чтобы обойти это, я назвал PrepareAuthorizedRequest как обычно, затем создал новый HttpWebRequest и скопировал его через заголовок OAuth-авторизации.

HttpWebRequest httpRequest = consumer.
    PrepareAuthorizedRequest(endpoint, AccessToken);

HttpWebRequest httpWebRequest = (HttpWebRequest)
    WebRequest.Create(serviceBase + "/Edit/6363241");

foreach (string headerKey in httpRequest.Headers.AllKeys)
    httpWebRequest.Headers.Add(headerKey, httpRequest.Headers[headerKey]);


httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

using (Stream requestStream = httpWebRequest.GetRequestStream())
{
    byte[] bytes = Encoding.UTF8.GetBytes(test22);
    requestStream.Write(bytes, 0, bytes.Length);
}

WebResponse webResponse = httpWebRequest.GetResponse();

string responseContent = new StreamReader(webResponse.GetResponseStream()).
    ReadToEnd();
1 голос
/ 19 декабря 2013

Вам необходимо установить заголовок Content-Length через свойство httpRequest.ContentLength до получения потока запроса .

Кроме того, хотя у вас уже было это, я часами искал, пытаясь выяснить, чего мне не хватало, что было HttpDeliveryMethods.AuthorizationHeaderRequest в объявлении endpoint.

string url = serviceBase + "/Booking/6363241";
HttpDeliveryMethods methods = HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest;
MessageReceivingEndpoint endpoint = new MessageReceivingEndpoint(url, methods);
WebRequest httpRequest = consumer.PrepareAuthorizedRequest(endpoint, AccessToken);
httpRequest.ContentType = "application/json";

byte[] bytes = Encoding.UTF8.GetBytes(test22);
httpRequest.ContentLength = bytes.Length;

using (Stream requestStream = httpRequest.GetRequestStream())
{
    requestStream.Write(bytes, 0, bytes.Length);
}

string responseContent;
using (HttpWebResposne response = (HttpWebResponse)httpRequest.GetResponseStream())
using (StreamReader reader = new StreamReader(response))
{
    responseContent = reader.ReadToEnd();
}
1 голос
/ 02 июня 2011

Полагаю, ваша ошибка в том, что вы передаете para в качестве третьего параметра PreparedAuthorizedRequest.Если вы передаете extraParameters, то вы сообщаете DotNetOpenAuth, что эти дополнительные параметры должны быть включены в полезную нагрузку сообщения, для которой требуется определенный тип содержимого.Если вы просто передадите null в качестве третьего параметра, я думаю, что вы можете избежать всего этого копирования заголовка и использовать свой собственный тип контента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...