RestSharp 发布请求 - 带有 x-www-form-urlencoded 值的正文

Posted

技术标签:

【中文标题】RestSharp 发布请求 - 带有 x-www-form-urlencoded 值的正文【英文标题】:RestSharp post request - Body with x-www-form-urlencoded values 【发布时间】:2017-12-27 13:53:13 【问题描述】:

我正在使用邮递员并发出一个 api 发布请求,我在其中添加带有 x-www-form-urlencoded 键/值的正文,它在邮递员中工作正常。

当我使用 RestSharp 包从 c# 中尝试时,问题出现了。

我尝试了下面的代码,但没有得到响应。我收到“BadRequest”invalid_client 错误。

public class ClientConfig 
    public string client_id  get; set;  = "value here";
    public string grant_type  get; set;  = "value here";
    public string client_secret  get; set;  = "value here";
    public string scope  get; set;  = "value here";
    public string response_type  get; set;  = "value here";


public void GetResponse() 
        var client = new RestClient("api-url-here");
        var req = new RestRequest("endpoint-here",Method.POST);
        var config = new ClientConfig();//values to pass in request

        req.AddHeader("Content-Type","application/x-www-form-urlencoded");
        req.AddParameter("application/x-www-form-urlencoded",config,ParameterType.RequestBody);

        var res = client.Execute(req);
        return;
    

//Also tried this

    req.AddParameter("client_id",config.client_id,"application/x-www-form-urlencoded",ParameterType.RequestBody);
                req.AddParameter("grant_type",config.grant_type,"application/x-www-form-urlencoded",ParameterType.RequestBody);
                req.AddParameter("client_secret",config.client_secret,"application/x-www-form-urlencoded",ParameterType.RequestBody);
                req.AddParameter("scope",config.scope,ParameterType.RequestBody);
                req.AddParameter("response_type",config.response_type,"application/x-www-form-urlencoded",ParameterType.RequestBody);

//tried this too
var client = new RestClient("url-here");
            var req = new RestRequest("endpointhere",Method.POST);
            var config = new ClientConfig();
req.AddBody(config);
var res = client.Execute(req);

【问题讨论】:

查看我的答案,如果对您有帮助,请标记为已接受答案。 :D 【参考方案1】:

这对我有用,它是邮递员的生成器

        var token = new TokenValidation()
        
               app_id = CloudConfigurationManager.GetSetting("appId"),
               secret = CloudConfigurationManager.GetSetting("secret"),
               grant_type = CloudConfigurationManager.GetSetting("grant_type"),
               Username = CloudConfigurationManager.GetSetting("Username"),
               Password = CloudConfigurationManager.GetSetting("Password"),
        ;

        var client = new RestClient($"xxxtokenEndPoint");
        var request = new RestRequest(Method.POST);
        request.AddHeader("content-type", "application/x-www-form-urlencoded");
        request.AddParameter("application/x-www-form-urlencoded", $"app_id=token.app_id&secret=token.secret&grant_type=token.grant_type&Username=token.Username&Password=token.Password", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);

        if (response.StatusCode != HttpStatusCode.OK)
        
            Console.WriteLine("Access Token cannot obtain, process terminate");
            return null;
        

        var tokenResponse = JsonConvert.DeserializeObject<TokenValidationResponse>(response.Content);

【讨论】:

这似乎没有对参数espacing引号等进行编码。它似乎还添加了一组额外的引号,将其与邮递员进行比较。 RestSharp.Extensions.StringExtensions.UrlEncode 方法可以在请求中发送之前对值进行编码。 为我工作。一直在使用 Json 反序列化器但没有成功 另一种选择是使用 Request.AddObject 像: var client = new RestClient(url); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/x-www-form-urlencoded"); var loginData = new LoginRequest(用户名,密码); request.AddObject(loginData); var result = await client.ExecuteAsync(request);【参考方案2】:

我个人觉得这种方式在发送 Form-UrlEncoded 数据时更适合我。

public void GetResponse() 
        var client = new RestClient("api-url-here");
        var req = new RestRequest("endpoint-here",Method.POST);
        var config = new ClientConfig();//values to pass in request

        // Content type is not required when adding parameters this way
        // This will also automatically UrlEncode the values
        req.AddParameter("client_id",config.client_id, ParameterType.GetOrPost);
        req.AddParameter("grant_type",config.grant_type, ParameterType.GetOrPost);
        req.AddParameter("client_secret",config.client_secret, ParameterType.GetOrPost);
        req.AddParameter("scope",config.scope, ParameterType.GetOrPost);
        req.AddParameter("response_type",config.response_type, ParameterType.GetOrPost);

        var res = client.Execute(req);
        return;

可以在此处找到有关此参数类型的详细信息: https://github.com/restsharp/RestSharp/wiki/ParameterTypes-for-RestRequest#getorpost

【讨论】:

谢谢,是 ParameterType.GetOrPost 为我修复了它(而不是 ParameterType.RequestBody)。 ClientConfig 是什么包?文档在哪里? 如果你使用req.AddParameter(name, value),它默认为ParameterType.GetOrPost,所以你只需要指定那个ParameterType,如果你想明确的话。【参考方案3】:

就我个人而言,我发现 AddObject() 方法非常有用,而且当你要添加这么多参数时更简洁。

public void GetResponse() 
        var client = new RestClient("api-url-here");
        var req = new RestRequest("endpoint-here",Method.POST);
        var config = new ClientConfig();//values to pass in request

        req.AddHeader("Content-Type","application/x-www-form-urlencoded");
        req.AddObject(config);

        var res = client.Execute(req);
        return res;
    

【讨论】:

【参考方案4】:

如果它对邮递员有效,您只需按右侧的代码按钮即可。这将提供多种语言的工作示例。它是信息图标上方的按钮。我会发布它的屏幕截图,但我没有 10 声望这样做。

【讨论】:

【参考方案5】:

在我的情况下,这是有效的

req.AddParameter("client_id", "unigen-corporation", ParameterType.HttpHeader);
req.AddParameter("grant_type", "client_credentials", ParameterType.GetOrPost);

【讨论】:

【参考方案6】:

如果您从邮递员那里复制了代码,请尝试删除以下内容:

request.AlwaysMultipartFormData = true;

在我的情况下,删除此行代码后有效。

【讨论】:

以上是关于RestSharp 发布请求 - 带有 x-www-form-urlencoded 值的正文的主要内容,如果未能解决你的问题,请参考以下文章

RestSharp 打印原始请求和响应标头

带有 RestSharp 的 Paypal Rest Api 在 xamarin android 中不起作用

使用 RestSharp 的多个请求(分页)

如何在 RestSharp 中向请求正文添加文本

如何将 json 格式的有效负载附加到 RestSharp 请求中?

POST x-www urlencoded 从云函数(Firebase)