【问题标题】:DotNetOpenAuth POST sample with JSON body带有 JSON 正文的 DotNetOpenAuth POST 示例
【发布时间】:2011-05-31 19:39:10
【问题描述】:

我正在使用 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();

【问题讨论】:

  • 很高兴你找到了答案,但你不应该把答案放在问题里面,而是放在“答案”部分,这样你就可以在一段时间后接受它。
  • 您能补充一下您如何定义您正在使用的MessageReceivingEndpoint 端点吗?
  • 抱歉延迟 MessageReceivingEndpoint endpoint = new MessageReceivingEndpoint(serviceBase + "/Booking/6363241", HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.PostRequest);

标签: .net wcf rest dotnetopenauth


【解决方案1】:

原为answered by iain

好的,我已经设法解决了这个问题。我发现的问题是我从ConsumerBase 调用PrepareAuthorizedRequest。此后,内容类型将不被接受,并且始终标记为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();

【讨论】:

    【解决方案2】:

    我相信您的错误是您将para 作为第三个参数传递给PreparedAuthorizedRequest。如果您传入 extraParameters,那么您就是在告诉 DotNetOpenAuth 这些额外参数必须包含在消息负载中,这需要特定的内容类型。如果您只是传入null 作为第三个参数,我认为您可以避免所有这些标头复制并使用您自己的自定义内容类型。

    【讨论】:

    • 嗨,如果我传入null,我在调用PreparedAuthorizedRequest 后无法写信给RequestStream
    • 这样做可以正常工作,但不支持用户代理。 DNOA 总是将代理设置为库版本:(
    【解决方案3】:

    您需要通过httpRequest.ContentLength 属性设置Content-Length 标头在获取请求流之前

    此外,虽然您已经拥有它,但我搜索了几个小时试图找出我缺少的东西,即 endpoint 声明中的 HttpDeliveryMethods.AuthorizationHeaderRequest

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2016-09-29
      • 2014-05-21
      • 2016-09-24
      相关资源
      最近更新 更多