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

nic*_*v80 28 c# post restsharp

我正在使用邮递员并发出api post请求,其中我添加了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);
Run Code Online (Sandbox Code Playgroud)

小智 29

发送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;
}
Run Code Online (Sandbox Code Playgroud)

有关此参数类型的详细信息,请访问:https: //github.com/restsharp/RestSharp/wiki/ParameterTypes-for-RestRequest#getorpost

  • 谢谢,是`ParameterType.GetOrPost` 为我修复了它(而不是`ParameterType.RequestBody`)。 (2认同)
  • ClientConfig是什么包?医生在哪里? (2认同)

Kir*_*Hao 28

这对我有用,它是邮递员的发电机

        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($"{xxx}{tokenEndPoint}");
        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);
Run Code Online (Sandbox Code Playgroud)


Din*_*nch 11

就我个人而言,我发现 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;
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

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