我试图使用RestSharp连接到一个复杂的API。该API使用OAuth1.0,并且在初始请求令牌中要求oauth_callback参数只在查询中,而不是在认证头中(我已经和Postman确认了这一点)。当我这样构造请求时。
var Authenticator = OAuth1Authenticator.ForRequestToken(mc_apiKey, mc_appsecret);
Authenticator.ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader;
Authenticator.SignatureMethod = OAuthSignatureMethod.PlainText;
client.Authenticator = Authenticator;
var request = new RestRequest(RequestToken, Method.POST);
string AuthorizationCallBackURL = string.Format(LoopbackCallback);
request.AddParameter(_oauthCallback, AuthorizationCallBackURL, ParameterType.QueryStringWithoutEncode);
并查看服务器上的日志,我看到Http调用中的查询字符串:
http://192.168.0.187:8080/xxxx/ws/oauth/initiate?oauth_callback=http://192.168.0.187:8080/provider_emailer/callback.jsp
但它也在认证头中。
Headers:
{Accept=[application/json, text/json, text/x-json, text/javascript, application/xml, text/xml],
accept-encoding=[gzip, deflate],
Authorization=[OAuth oauth_callback="http://192.168.0.187:8080/provider_emailer/callback.jsp",
oauth_consumer_key="XXXXXXXXXXXX",
oauth_nonce="cei09xm04qetk2ce",
oauth_signature="XXXXXXXXXXXXXXXX",
oauth_signature_method="PLAINTEXT",
oauth_timestamp="1591197088",
oauth_version="1.0"],
Content-Length=[0], Content-Type=[null],
cookie=[JSESSIONID=C8C8DB501382F7D1E52FE436600094C0],
host=[192.168.0.187:8080], user-agent=[RestSharp/106.11.4.0]}
这会导致 "NotAcceptable "的响应。用Postman完成同样的请求,但在Authentication头中不包含回调参数,也能正常工作,我是不是做错了什么?有没有办法只在查询字符串中获取回调参数?
这是棘手的。我看了一下代码,当你在没有这个参数的情况下使用重载时,我们并没有将回调URL设置为工作流对象。所以,你的做法在概念上是正确的。
但是,我们必须收集所有的参数(默认参数和请求参数)加上OAuth参数来建立OAuth签名。然后,我们使用参数集合并提取所有名称以 oauth_
或 xauth_
到请求头中(如果你使用了 HttpAuthorizationHeader
),通过这样做,我们把你的查询参数放到了头部。
显然,这并不理想,而且看起来像是一个bug,所以我可以建议在RestSharp仓库中开一个问题。应该不难修复。