我想在POST某个地方使用RestSharp .我直接发布JSON(而不是POCO).因为我发布了普通的JSON,我相信我需要使用这种解决方法而不是设置Body:
request.AddParameter(
"application/json", myJsonString, ParameterType.RequestBody);
Run Code Online (Sandbox Code Playgroud)
当我没有压缩JSON时,这很好用.当我这样做时,使用这个:
request.Headers.Add("Content-Encoding", "gzip");
request.AddParameter(
"application/json",
GZipStream.CompressString(myJsonString),
ParameterType.RequestBody);
Run Code Online (Sandbox Code Playgroud)
这不起作用.我逐步完成了代码RestClient::ConfigureHttp,我看到了:
http.RequestBody = body.Value.ToString();
Run Code Online (Sandbox Code Playgroud)
因为我给出了一个字节数组,body.Value所以设置为System.Byte[]
有没有办法让RestSharp在POST请求中处理gzip压缩的json字符串?
我正在使用restsharp并遇到了问题.由于我使用google api返回xml数据,因此我遇到名称冲突.
例如,返回来自google contact api的所有"group"和"all contacts"都有一个"feed"的根节点,但其中包含不同的数据.
所以我这样做了
[XmlRoot(ElementName = "feed")]
public class GroupFeed
{
public string Id { get; set; }
public DateTime Updated { get; set; }
public string Title { get; set; }
public int TotalResults { get; set; }
public int StartIndex { get; set; }
public int ItemsPerPage { get; set; }
[XmlElement(ElementName="Entry")]
public List<GroupEntry> Entries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
通过使用XmlRoot属性,它在我使用restsharp时起作用,但它从不填充Entries,即使它们是数据.
[XmlRoot(ElementName = "entry")]
public class GroupEntry
{
public string Id { get; set; } …Run Code Online (Sandbox Code Playgroud) 我有一个Web API服务,我试图通过控制台使用RestSharp访问.我的RestSharp代码如下所示:
RestClient client = new RestClient(baseUrlString);
RestRequest request = new RestRequest("controllername/actionname");
request.RequestFormat = DataFormat.Json;
ProcessQuestion model = new ProcessQuestion()
{
Id = "123456",
InstanceId = "123",
UniqueId = "bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626",
PostedAnswer = new Dictionary<string, string>() { { "question_7907_1", "selected" }, { "question_7907_2", "selected" } }
};
request.AddBody(model);
var response = client.Execute(request)
Run Code Online (Sandbox Code Playgroud)
我的Web API操作采用与上述模型具有相同参数的模型.调用执行时,绑定失败,参数为null.我怀疑这是由于RestRequest.AddBody方法将application/json预先添加到body值,如下所示:
{application/json={"Id":"123456","InstanceId":"123","UniqueId":"bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626","PostedAnswer":{"question_7907_1":"selected","question_7907_2":"selected"}}}
Run Code Online (Sandbox Code Playgroud)
如果我使用Fiddler发布,身体会正确地绑定到模型.以下是我在Fiddler中提供的身体价值:
{'Id':'123456','InstanceId':'123','Uniqueid':'bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626','PostedAnswer':{'question_7907_1':'selected','question_7907_2':'selected'}}
Run Code Online (Sandbox Code Playgroud)
请注意,fiddler中的body值是相同的,除了preing application/json键.
还要注意:我已经尝试过似乎所有东西......我已经在动作中分离了参数,使用了FromBody和FromUri属性,尝试了自定义DictionaryModelBinder,尝试了自定义ValueBinders,试图改变我使用RestSharp的方式(带有RequestBody参数的AddParameter,AddObject,不同的URL样式等).
有没有其他人遇到这个,如果有的话,你解决了吗?我为这项服务选择了Web API,希望模型绑定能像在MVC中那样工作,但我看到的并非如此.
谢谢
编辑(已解决):RestSharp自动将JsonSerializer用于AddBody方法中传递的对象.我想我错过了一些简单的东西,事实上我是......将Method.Post参数添加到RestRequest实例化解决了这个问题.
在特定情况下,我需要能够在请求/响应中禁用压缩。
使用 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) 有人可以帮我将使用 RestSharp 的这个 ASP .Net Core 示例(在我的 Web Api 中使用以使用来自 Auth0 的管理 API)转换为一个使用 HttpClient 的示例吗?
var client = new RestClient("https://YOUR_AUTH0_DOMAIN/oauth/token");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{\"grant_type\":\"client_credentials\",\"client_id\": \"YOUR_CLIENT_ID\",\"client_secret\": \"YOUR_CLIENT_SECRET\",\"audience\": \"https://YOUR_AUTH0_DOMAIN/api/v2/\"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Run Code Online (Sandbox Code Playgroud)
我一直在挣扎......我有这个:
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.BaseAddress = new Uri("https://YOUR_AUTH0_DOMAIN/oauth/token");
Run Code Online (Sandbox Code Playgroud)
但我不确定其余的...谢谢
您好,我一直在使用 REST 方法在 C# 中集成 Google Ads API。一切似乎都工作正常,但突然间我开始收到带有错误消息的 400 响应。
{
"error": "invalid_grant",
"error_description": "Token has been expired or revoked."
}
Run Code Online (Sandbox Code Playgroud)
如上所述,我没有使用客户端库,而是使用 Restsharp 并使用邮递员测试我的所有端点。
它发生的任何原因是什么?我的刷新令牌也有效。我已经使用这个一周了。我也没有达到刷新令牌的限制,因为当我尝试设置帐户时,我只生成了 3 到 4 次刷新令牌。
我相信刷新令牌的有效性是终生的,那么为什么会发生这种情况呢?
我使用 RestSharp 编写了以下测试,预期结果是返回错误 400 以及一些 Json 格式的错误消息。
但以下测试在等待 client.PostAsync(request) 处失败并抛出“System.Net.Http.HttpRequestException:请求失败,状态代码为 BadRequest”,并且未到达断言语句。
使用 Fiddler 我验证了我的请求,并且响应按预期工作。
将不胜感激任何解决这个问题的建议。谢谢你!
[Test]
public async Task Test1Async()
{
var jsonData = json;
var client = new RestClient(endpoint);
var request = new RestRequest();
request.AddStringBody(jsonData, ContentType.Json);
var response = await client.PostAsync(request);
Assert.AreEqual(400, response.StatusCode);
}
Run Code Online (Sandbox Code Playgroud)
有效的解决方案。谢谢尼古拉斯·费尔赫斯特...
[Test]
public async Task Test1Async()
{
var jsonData = json;
var client = new RestClient(endpoint);
var request = new RestRequest();
request.AddStringBody(jsonData, ContentType.Json);
var response = await client.ExecutePostAsync(request);
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
}
Run Code Online (Sandbox Code Playgroud)