如何使用RestSharp进行POST请求

55

我正在尝试使用RestSharp客户端进行POST请求,如下所示。 我将授权代码传递给以下函数。

public void ExchangeCodeForToken(string code)
{
    if (string.IsNullOrEmpty(code))
    {
        OnAuthenticationFailed();
    }
    else
    {           
        var request = new RestRequest(this.TokenEndPoint, Method.POST);
        request.AddParameter("code", code);
        request.AddParameter("client_id", this.ClientId);
        request.AddParameter("client_secret", this.Secret);
        request.AddParameter("redirect_uri", "urn:ietf:wg:oauth:2.0:oob");
        request.AddParameter("grant_type", "authorization_code");
        request.AddHeader("content-type", "application/x-www-form-urlencoded");

        client.ExecuteAsync<AuthResult>(request, GetAccessToken);
    }
}

void GetAccessToken(IRestResponse<AuthResult> response)
{
    if (response == null || response.StatusCode != HttpStatusCode.OK
                         || response.Data == null 
                         || string.IsNullOrEmpty(response.Data.access_token))
    {
        OnAuthenticationFailed();
    }
    else
    {
        Debug.Assert(response.Data != null);
        AuthResult = response.Data;
        OnAuthenticated();
    }
}

但是我得到了响应状态码为“Bad Request”。有人可以帮我吗,告诉我如何使用RestSharp客户端进行POST请求。

6个回答

78

我使用的 RestSharp POST 方法:

var client = new RestClient(ServiceUrl);

var request = new RestRequest("/resource/", Method.POST);

// Json to post.
string jsonToSend = JsonHelper.ToJson(json);

request.AddParameter("application/json; charset=utf-8", jsonToSend, ParameterType.RequestBody);
request.RequestFormat = DataFormat.Json;

try
{
    client.ExecuteAsync(request, response =>
    {
        if (response.StatusCode == HttpStatusCode.OK)
        {
            // OK
        }
        else
        {
            // NOK
        }
    });
}
catch (Exception error)
{
    // Log
}

2
string jsonToSend = JsonHelper.ToJson(json); 你能解释一下这行代码吗? - Emre Kenci
它只是将对象转换为JSON字符串。(json = 对象,jsonToSend = “json”的JSON表示形式)。我应该更改这些名称。 - David
如何将文件附加到您的请求中? - OPV
似乎JsonHelper.ToJson()不再可用。 - Yster
在我的情况下,我必须使用“application/json”而不带有“charset=utf-8”的部分。 - robino16

21

这种方法对我来说很有效:

var request = new RestSharp.RestRequest("RESOURCE", RestSharp.Method.POST) { RequestFormat = RestSharp.DataFormat.Json }
                .AddBody(BODY);

var response = Client.Execute(request);

// Handle response errors
HandleResponseErrors(response);

if (Errors.Length == 0)
{ }
else
{ }

希望这可以帮到你!(虽然有点晚)


你的代码是唯一一个在我的Node.js API中可用的。谢谢! - coffekid
5
你没有定义客户端。 - Edwin O.

11

2017年以来,我通过一个REST服务发布内容并从中获取结果:

        var loginModel = new LoginModel();
        loginModel.DatabaseName = "TestDB";
        loginModel.UserGroupCode = "G1";
        loginModel.UserName = "test1";
        loginModel.Password = "123";

        var client = new RestClient(BaseUrl);

        var request = new RestRequest("/Connect?", Method.POST);
        request.RequestFormat = DataFormat.Json;
        request.AddBody(loginModel);

        var response = client.Execute(request);

        var obj = JObject.Parse(response.Content);

        LoginResult result = new LoginResult
        {
            Status = obj["Status"].ToString(),
            Authority = response.ResponseUri.Authority,
            SessionID = obj["SessionID"].ToString()
        };

4
目前(截至2019年5月28日),如果您选择使用DataFormat.Json而不是XML,您应该使用AddJsonBody而不是AddBody。这将在一个语句中完成对象转换成JSON并添加到请求的正文中。 - Chris

8

在发送请求之后,最好使用类似以下的 JSON 格式。

  var clien = new RestClient("https://smple.com/");
  var request = new RestRequest("index", Method.POST);
  request.AddHeader("Sign", signinstance);    
  request.AddJsonBody(JsonConvert.SerializeObject(yourclass));
  var response = client.Execute<YourReturnclassSample>(request);
  if (response.StatusCode == System.Net.HttpStatusCode.Created)
   {
       return Ok(response.Content);
   }

2

我添加了这个帮助方法来处理返回我关心的对象的POST请求。

对于REST纯粹主义者,我知道,除状态以外的任何内容都不应该被返回。但是,我有一个太大而无法用查询字符串参数传递的ID集合。

帮助方法:

    public TResponse Post<TResponse>(string relativeUri, object postBody) where TResponse : new()
    {
        //Note: Ideally the RestClient isn't created for each request. 
        var restClient = new RestClient("http://localhost:999");

        var restRequest = new RestRequest(relativeUri, Method.POST)
        {
            RequestFormat = DataFormat.Json
        };

        restRequest.AddBody(postBody);

        var result = restClient.Post<TResponse>(restRequest);

        if (!result.IsSuccessful)
        {
            throw new HttpException($"Item not found: {result.ErrorMessage}");
        }

        return result.Data;
    }

使用方法:

    public List<WhateverReturnType> GetFromApi()
    {
        var idsForLookup = new List<int> {1, 2, 3, 4, 5};

        var relativeUri = "/api/idLookup";

        var restResponse = Post<List<WhateverReturnType>>(relativeUri, idsForLookup);

        return restResponse;
    }

2
RestRequest.AddBody(object)已经过时:请使用AddXmlBody或AddJsonBody。 - Luca Ziegler

0
最好指定Json数据主体。
var client = new RestClient("URL");
var request = new RestRequest("Resources",Method.POST);
request.RequestFormat = RestSharp.DataFormat.Json;
request.AddBody(new classname
{
  id = value1;
  Name = "";

});
var response = client.Execute(request);

检查响应中的状态码。

始终确保状态码应为OK。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接