我正在尝试使用RestSharp从我的网络应用发布Twitter状态.以下代码完美运行:
var status = "I am fine with posting this status.";
var client = new RestClient("https://api.twitter.com");
// The OAuth keys/tokens/secrets are retrieved elsewhere
client.Authenticator = OAuth1Authenticator.ForProtectedResource(
_consumerKey, _consumerSecret, _accessToken, _accessTokenSecret
);
var request = new RestRequest("/1.1/statuses/update.json", Method.POST);
request.AddParameter("status", status, ParameterType.GetOrPost);
var response = client.Execute(request);
Run Code Online (Sandbox Code Playgroud)
但是,如果我在状态文本中包含以下任何字符,则此代码将失败并出现身份验证错误: ! * ' ( )
通过大量的论坛拖网,我推断这与OAuth签名编码不匹配POST参数的编码有关.我在SO上发现了这个问题,但在GitHub上搜索RestSharp问题却没有任何帮助.
我可以在RestSharp source(UrlEncodeRelaxed)中看到一些代码,这些代码似乎是手动编码符合OAuth编码规范的特定字符集,因此我尝试以相同的方式手动编码我的状态中的这些字符(使用代码来自RestSharp)之前传入它,例如:
var status = "I'm NOT fine with posting this status.";
string[] UriRfc3986CharsToEscape = …Run Code Online (Sandbox Code Playgroud) 我正在使用RestSharp在客户端进行开发.我也在服务器端使用Ruby Grape gem作为我的自定义API.Grape gem可以通过设置Accept HTTP header fe来进行版本控制application/vnd.twitter-v1+json
通过控制台测试命令工作完美
curl -H Accept=application/vnd.twitter-v1+json /statuses/public_timeline
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试为RestRequest设置标头时,我正在error 404服务器上.
我不知道为什么会这样.我发现了服务器返回的另一个问题406 error- 但在我的情况下是404.
如何为Accept标头添加自定义值?
我有Httpclient函数,我试图转换为RestSharp但我面临一个问题,我无法解决使用谷歌.
client.BaseAddress = new Uri("http://place.holder.nl/");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",access_token);
HttpResponseMessage response = await client.GetAsync("api/personeel/myID");
string resultJson = response.Content.ReadAsStringAsync().Result;
Run Code Online (Sandbox Code Playgroud)
这个代码在我的HttpClient代码中,它运行良好,但是我无法在RestSharp中使用它,我在使用RestSharp时总是未经授权:
RestClient client = new RestClient("http://place.holder.nl");
RestRequest request = new RestRequest();
client.Authenticator = new HttpBasicAuthenticator("Bearer", access_token);
request.AddHeader("Accept", "application/json");
request.Resource = "api/personeel/myID";
request.RequestFormat = DataFormat.Json;
var response = client.Execute(request);
Run Code Online (Sandbox Code Playgroud)
我错过了认证的东西吗?
我有一个restsharp客户端和请求设置如下:
var request = new RestRequest();
request.Method = Method.POST;
request.AddParameter("application/json", jsonBody, ParameterType.RequestBody);
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
request.Timeout = -1;
request.ReadWriteTimeout = -1;
var url = $"http://{ipAddress}/api/calculate";
var client = new RestClient();
client.BaseUrl = new Uri(url);
client.Timeout = -1;
client.ReadWriteTimeout = -1;
var response = client.Execute(request);
Run Code Online (Sandbox Code Playgroud)
这个请求需要一段时间才能完成,大约需要30分钟.现在,我知道有更优雅的方法可以做到这一点,但是,对于这个请求,我需要这样做.
此RestSharp客户端和请求在Windows服务中执行.当服务执行请求时,它会抛出TimoutException并且请求最大超时大约为40秒.
出于某种原因,我设置的超时对于这种情况不起作用.
有人有解决方案吗?
我正在使用RestSharp通过Querystring调用HTTP服务.该服务生成Word文档.
当我调用此服务时,它看起来像是在"内容"属性中返回Word文档,但我很难弄清楚如何通过传统的下载窗口将此内容作为word文档返回给用户进行保存.
public ActionResult DocGen(string strReportId)
{
var client = new RestClient("http://localhost:88");
var request = new RestRequest("DocGen/{id}", Method.GET);
request.AddUrlSegment("id", "1060"); // replaces matching token in request.Resource
// execute the request
//RestResponse response = (RestResponse) client.Execute(request);
IRestResponse response = client.Execute(request);
if (response.ErrorException != null)
{
const string message = "Error retrieving response. Check inner details for more info.";
var myException = new ApplicationException(message, response.ErrorException);
throw myException;
}
// Important and simple line. response.rawbytes was what I was missing.
return File(response.RawBytes,response.ContentType,"sample.doc");
} …Run Code Online (Sandbox Code Playgroud) 在特定情况下,我需要能够在请求/响应中禁用压缩。
使用 Firefox RestClient 我能够将一些 xml 发布到 Web 服务并使用单个标头参数“Accept-Encoding”:“”成功获得一些响应 xml,如果我不设置此标头,则响应正文将返回压缩响应正文中的一些二进制数据(这就是我想在响应中禁用 gzip 的原因)
现在在我的应用程序中使用相同的标头值(在 C# 中使用 RestSharp),我仍然得到二进制数据 (gzip) 作为响应。
有人可以透露一些信息吗?RestSharp 支持吗?
我创建了一个 ASP.NET MVC 应用程序,它可以在 Bitbucket 上授权用户。我使用CSharp.Bitbucket 库来获取令牌秘密和令牌值。
该OAuth的教程说,与令牌,我可以进行API调用。
我知道我可以像这样使用基本授权调用 API:
string url = "https://bitbucket.org/api/1.0/user/";
var request = WebRequest.Create(url) as HttpWebRequest;
string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("username" + ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);
using (var response = request.GetResponse() as HttpWebResponse)
{
var reader = new StreamReader(response.GetResponseStream());
string json = reader.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
但是如何使用访问令牌调用 API?
非常感谢!
C# RestSharp 库与 Kerberos 身份验证的兼容性如何?
我可以看到有一个,NtlmAuthenticator但我们是否需要使用 Kerberos 实现相同的功能,还是由底层 HTTP 调用自动管理?
我有 Web api 控制器上传控制器,它具有PostUpload将数据存储到数据库的方法。
现在我正在尝试将文件和一些参数发布到该 web api,但所有尝试都失败了,比如通过数组列表,json 对象,我们不能将文件和参数发布到 web api?
var request = new RestRequest("Uploads", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddHeader("Content-Type", "application/json");
request.AddFile("filename", Server.MapPath("/Images/137549014628194.R6MyHlYrIfIo3BWPIytG_height640.png"), "image/png");
request.AddFile("filename", Server.MapPath("/Images/137549014628194.R6MyHlYrIfIo3BWPIytG_height640.png"), "image/png");
request.AddFile("filename", Server.MapPath("/Images/137549014628194.R6MyHlYrIfIo3BWPIytG_height640.png"), "image/png");
request.AddParameter("participantsId", 2);
request.AddParameter("taskId", 77);
request.AddParameter("EnteredAnswerOptionId", 235);
IRestResponse response = createClient().Execute(request);
Run Code Online (Sandbox Code Playgroud)
网络API方法:
[HttpPost]
public string PostUpload(int? participantsId, int? taskId, int? EnteredAnswerOptionId)
{
var file = HttpContext.Current.Request.Files.Count > 0 ?
HttpContext.Current.Request.Files[0] : null;
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(HttpContext.Current.Server.MapPath("~/uploads"), fileName);
file.SaveAs(path);
}
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个 C# dotnetcore 控制台应用程序来与使用 OAuth2 进行授权的 api 进行交互。我还没有完全弄清楚如何将其用于 C# 控制台应用程序,甚至是不打算让用户登录的库。这可能吗?
到目前为止我得到的是以下内容:
private static string _auth_url = "https://idp.bexio.com/authorize";
private static string _token_url = "https://idp.bexio.com/token";
private static string _callback_url = "https://www.myurl.com";
private static string _scope = "monitoring_show";
private static string _client_id = "myid";
private static string _client_secret = "mysecret";
static void Main(string[] args)
{
//request token
var restclient = new RestClient(_auth_url);
RestRequest request = new RestRequest("request/oauth") {Method = Method.POST};
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("client_id", _client_id);
request.AddParameter("client_secret", _client_secret);
request.AddParameter("grant_type", "client_credentials");
var tResponse = …Run Code Online (Sandbox Code Playgroud)