【问题标题】:Pass parameters to web api from console application从控制台应用程序将参数传递给 Web api
【发布时间】:2025-12-26 15:35:17
【问题描述】:

我需要通过控制台应用程序与 Web api 进行通信。

api 需要像这样传递给它的两个变量/参数:

    [HttpPost("api/loans/range/enroll/{loanStart}/{loanEnd}")]
    public IActionResult PostLoanData(DateTime loanStart, DateTime loanEnd)
    {
        Loans.CreateLoanDates(loanStart, loanEnd);
        return NoContent();
    }

所以在我的主要方法中,我做了这样的事情:

static void Main(string[] args)
{
        var LoanDateRange = new Dictionary<string, string>
                {
                    {"loanStart", startDate.ToString()},
                    {"loanEnd", endDate.ToString()}
                };

        var json = JsonConvert.SerializeObject(LoanDateRange);
        HttpClient client = new HttpClient();
        client.PostAsync("http://mybank1.com/api/loans/range/enroll", new StringContent(json, Encoding.UTF8, "application/json"))
            .ContinueWith(task => {
                var response = task.Result;
                    Console.WriteLine(response.Content.ReadAsStringAsync().Result);
                });
        Console.ReadLine();
 }

当我运行程序时,我得到一个空异常。

如何从控制台应用程序中为 api 提供所需的内容?或者,我可以更改 api 以便它可以更好地与控制台应用程序交互吗?

谢谢!

【问题讨论】:

  • 你的 startDate/endDate 在哪里初始化???

标签: c# c#-4.0 asp.net-core asp.net-web-api2


【解决方案1】:

试试这个方法

创建模型

class DateModel 
{
    public DateTime LoadStart {get;set;}
    public DateTime LoadEnd {get;set;}
}

然后更新你的 api

[HttpPost("api/loans/range/enroll")]
public IActionResult PostLoanData([FromBody] DateModel loan)
{
    Loans.CreateLoanDates(loan.LoadStart, loan.LoadEnd);
    return NoContent();
}

然后从控制台应用程序调用

static void Main(string[] args)
{
    var LoanDateRange = new DateModel();
        LoanDateRange.LoadStart = startDate.ToString();
        LoanDateRange.LoadEnd = endDate.ToString();

    UploadAsync(LoanDateRange);

    Console.ReadLine();
}

public static  async Task UploadAsync(DateModel LoanDateRange)
    {
        using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://mybank1.com/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                StringContent content = new StringContent(JsonConvert.SerializeObject(LoanDateRange), Encoding.UTF8, "application/json");

                try
                {
                    HttpResponseMessage response = await client.PostAsync("api/loans/range/enroll", content);
                    if (response.IsSuccessStatusCode)
                    {
                        // "Success", MessageBoxButtons.OK);
                    }
                }
                catch (Exception)
                {
                    // ignored
                }
            }
    }

【讨论】:

  • 只是一个友好的提示,您不能在 Main 方法中等待;)
  • 并且你需要使用[FromBody]属性,当你在请求体中将模型作为json传递时
【解决方案2】:

以及带有 Newtonsoft.Json 的最终版本

public class TestClass
{
    [JsonProperty]
    public string Server { get; set; }
    [JsonProperty]
    public string UserName { get; set; }
    [JsonProperty]
    public List<ShareData> Shares { get; set; }
}

 using (var client = new HttpClient()
 {
      string uri = new Uri("http://myapiendpoint/").ToString();

      string content = JsonConvert.SerializeObject(TestClass);
      var response = await client.PostAsync(uri, new StringContent(content, Encoding.UTF8, "application/json"));
 }

 

【讨论】:

    最近更新 更多