【问题标题】:Add a GET parameter to a POST request with RestSharp使用 RestSharp 将 GET 参数添加到 POST 请求
【发布时间】:2012-05-25 01:06:12
【问题描述】:

我想向这样的 URL 发出 POST 请求:

http://localhost/resource?auth_token=1234

我想在正文中发送 JSON。我的代码如下所示:

var client = new RestClient("http://localhost");
var request = new RestRequest("resource", Method.POST);
request.AddParameter("auth_token", "1234");    
request.AddBody(json);
var response = client.Execute(request);

如何将auth_token 参数设置为GET 参数并将请求设为POST?

【问题讨论】:

    标签: c# .net web-services webservice-client restsharp


    【解决方案1】:

    当前版本的 RestSharp 有一个使用模板的简短方法:

    var request = new RestRequest("resource?auth_token={token}", Method.POST);
    request.AddUrlSegment("token", "1234");
    

    或者,您可以添加不带模板的参数:

    var request = new RestRequest("resource", Method.POST);
    request.AddQueryParameter("auth_token", "1234); 
    

    var request = new RestRequest("resource", Method.POST);
    request.AddParameter("auth_token", "1234", ParameterType.QueryString); 
    

    【讨论】:

    • 值得注意的是,ParameterType.QueryString 是在 RestSharp v104.3 中添加的。我的项目引用了旧版本,因此如果不升级就无法使用。
    • v105.0.0 引入了request.AddQueryParameter(name,value),它是request.AddParameter(name, value, ParameterType.QueryString) 的包装器
    【解决方案2】:

    如果您 1) 将令牌添加到资源 url 并且 2) 像这样指定 ParameterType.UrlSegment,这应该可以工作:

    var client = new RestClient("http://localhost");
    var request = new RestRequest("resource?auth_token={authToken}", Method.POST);
    request.AddParameter("auth_token", "1234", ParameterType.UrlSegment);    
    request.AddBody(json);
    var response = client.Execute(request);
    

    这远非理想 - 但我找到的最简单的方法......仍然希望找到更好的方法。

    【讨论】:

    • 难道没有更好的解决方案,它不涉及在手动指定的查询字符串令牌中使用 UrlSegment?这可行,但它是一个令人讨厌的解决方法......而且它并不适合所有情况。
    • 它有效,但正如@SebastianZaklada 所说。这并不是一个真正“好”的解决方案。
    • 在没有 UrlSegment 的情况下是否有人可以正常工作?太可怕了......我们需要能够在 URL 中添加参数,而不管 HTTP VERB,因为它可以遵循 HTTP 规范......在我的例子中,我有一个所有请求都通过它的基类,和只发送发布数据的子类,所以我想将此令牌封装在基类中,否则,每次我需要令牌时,我都需要将它添加到 URL 中......例如,这是我在基类上调用的方法它不起作用,除非我之前在请求上设置了占位符......耻辱......
    • protected T Execute(RestRequest request) where T : new() { if (!string.IsNullOrWhiteSpace (m_token)) { request.AddParameter ("token", m_token); } var tcs = new TaskCompletionSource (); m_client.ExecuteAsync (request, response => { tcs.SetResult (response.Data); }); tcs.Task.Wait();返回 tcs.Task.Result; }
    • @QueueHammer,您确定 C# 6 字符串插值将正确处理值内的 ?&= 符号(URL 编码)吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多