如何在使用RestSharp和OAuth2时解决UnsupportedMediatType

时间:2015-05-09 14:08:15

标签: c# rest oauth-2.0 restsharp

就在几分钟前,我设法让我的代码与RestSharpOAuth2一起使用,检索访问令牌。我现在想要在我对REST API进行的每次调用中使用该标记。不幸的是,尽管响应状态已经完成,我仍然会收到UnsupportedMediaType StatusCode

当我提出请求时,这是我的代码:

RestClient client = new RestClient("http://www.example.com/myapi/products/get");
client.Proxy = proxy;

RestRequest request = new RestRequest( ) { Method = Method.POST };
request.AddParameter("application/json", String.Format( "{{\"email\": \"{0}\", \"key\": \"{1}\"}}", email, key ), ParameterType.RequestBody);

request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");     

request.AddParameter("access_token",APIAuthenticator.Instance().GetAccessToken(proxy));

var response = client.Execute(request);

APIAuthenticator.Instance().GetAccessToken(proxy)工作正常,只需获取访问令牌即可。那么问题是什么呢?

1 个答案:

答案 0 :(得分:1)

看看你在这做什么

request.AddParameter("application/json", 
    String.Format( "{{\"email\": \"{0}\", \"key\": \"{1}\"}}", email, key ), 
    ParameterType.RequestBody);

request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); 
request.AddParameter("access_token",APIAuthenticator.Instance().GetAccessToken(proxy));

首先,使用application/json Content-Type将正文设置为JSON。请求只能有一个正文。您在最后两行中所做的是覆盖原始行。您将Content-Type设置为application/x-www-form-urlencoded并将正文设置为访问令牌。

您获得415不支持的媒体类型的原因很可能是因为资源端点期望数据(您的JSON)为application/json。它不支持你用它覆盖它的类型。如果发生了事件,您仍然发送错误的数据(您的访问令牌)。

那么如何发送访问令牌?可以在查询字符串中发送它(取决于auth服务器配置),即

.../myapi/products/get?access_token=yourAccessToken

但这更适用于Implicit Grant Type

更常见的方法是在Authorization标题中发送令牌,如here in the RFC所示,例如

request.AddHeader("Authorization", "Bearer " + accessToken);

现在这取决于auth服务器中配置的配置文件,但在大多数情况下,应该接受Bearer。

然后摆脱

//request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
//request.AddParameter("access_token",APIAuthenticator.Instance().GetAccessToken(proxy));