簡體   English   中英

HttpClient通過控制台應用程序C#消耗Web API

[英]Httpclient consume web api via console app C#

我正在嘗試使用Httpclient通過控制台應用程序使用以下Web API。 我被困在如何傳遞參數中。 參數將作為命令行參數來。 這是我的Rest API

[HttpPost, Route("Test")]
        public IHttpActionResult Test(bool sample = false)
        {             
                return Ok();
        }

參數進來這是作為命令行參數

/Parameters:sample=true.

這是我在控制台應用程序中解析參數的方式

 static int Main(string[] args)
        {

                if (args.Length == 0)
                {
                    Console.Error.WriteLine("No action provided.");
                    return -1;
                }
                foreach (string param in args)
                {
                    switch (param.Substring(0, param.IndexOf(":")))
                    {
                        case "/Action":
                            action = param.Substring(param.IndexOf(":") + 1);
                            break;
                        case "/Parameters":
                            parameter = param.Substring(param.IndexOf(":") + 1);
                            break;    
                    }
                }
            return 0;
        }

一旦我得到了這種格式的參數

參數=“ sample = true”

我正在嘗試調用網絡api調用,但無法傳遞參數值。 任何人都可以指出我在做什么錯

    client.BaseAddress = new Uri(ConfigurationManager.AppSettings.Get("BaseWebApiUrl"));
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    var apiUrl = GetApiURL();


                   var Context = new StringContent(JsonConvert.SerializeObject(parameter), Encoding.UTF8, "application/json");

 var respFeed = await client.PostAsync(apiUrl, Context);

您應該將其作為URL的一部分傳遞。

private void CallService(bool sample)
{
    client.BaseAddress = new Uri(ConfigurationManager.AppSettings.Get("BaseWebApiUrl"));
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var apiUrl = $"http://yourserver:port/api/somecontroller/?sample={sample}";

    var Context = new StringContent(JsonConvert.SerializeObject(parameter), Encoding.UTF8, "application/json");

    var respFeed = await client.PostAsync(apiUrl, Context);
}

默認情況下,Web Api中的基本類型參​​數永遠不會綁定到請求的主體。

如果要強制將bool參數與請求主體綁定,則需要使用FromBodyAttribute裝飾它:

[HttpPost, Route("Test")]
public IHttpActionResult Test([FromBody] bool sample = false)
{             
    return Ok();
}

請注意 ,即使執行此操作,您的請求也不適用於Web Api。 必須以特定格式傳遞單個基本類型參​​數。 在您的情況下,您的請求正文必須為以下內容:

=true

更好的方法是將Action參數轉換為類:

public class TestModel
{
    public bool Sample { get; set; }
}

[HttpPost, Route("Test")]
public IHttpActionResult Test(TestModel model)
{
    return Ok();
}

這樣,您將能夠將Json對象作為請求正文發送,例如:

{
    "sample": true
}

這是一個如何獲得這種結果的小例子:

var parameterDictionary = parameter.Split("=").ToDictionary(s => s[0], s => bool.Parse(s[1]));
var json = JsonConvert.SerializeObject(parameterDictionary);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var respFeed = await client.PostAsync(apiUrl, content);

首先,將您的方法簽名更改為

public IHttpActionResult Test([FromBody]bool sample = false)

因為原始類型是通過URL /查詢字符串而不是正文來解析的。 通過添加FromBody屬性,將強制其從正文中解析。

接下來,由於您說參數值為var parameter =“ sample = true” ;,所以將參數構造更改為

var jsonParam = new { sample = parameter.split('=')[1]}; // I'm leaving null checks and validation for simplicity
var Context = new StringContent(JsonConvert.SerializeObject(jsonParam), Encoding.UTF8, "application/json");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM