如何从 HTTPContext 的 WebAPI 请求中获取函数参数?

How to get a Function Parameter from WebAPI Request from HTTPContext?

我有一个名为 API 的 Web 方法

    GetDetails(int id, string Name, string country)

在 API 中,我需要获取 id 值进行验证,我正在尝试使用以下代码获取原始 JASON,

     using (var reader = new StreamReader(context.Request.Body))
     {
           var body = reader.ReadToEndAsync();
     }

我在变量主体中获取原始数据如下

{"query":"query\n{\n\n GetDetails(id:1234,Name:"lolo",country:"US" { }\n \n}\n"}

我正在尝试使用以下代码对字符串进行反序列化

using (var reader = new StreamReader(context.Request.Body))
{
    var body = reader.ReadToEndAsync();
    string[] theJson = JsonConvert.DeserializeObject<string[]>(body.Result.ToString());
}

我尝试了下面的方法,

IEnumerable<string> strings = JsonConvert.DeserializeObject<IEnumerable<string>>(body.Result.ToString());

我遇到异常:

Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: S. Path '', line 0, position 0. at Newtonsoft.Json.JsonTextReader.ParseValue() at Newtonsoft.Json.JsonReader.ReadAndMoveToContent() at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)

如何从上面的原始文件中获取 id Json,感谢您的指导。

首先,您提供的Json格式不正确,系统无法解析。您可以告诉我们如何将 Json 发送到控制器。

其次,你可以尝试从Query中获取HTTP请求中的参数,从请求体中获取参数更容易。第三,如果你必须从请求体中获取参数,我建议你使用模型绑定。这是我的代码:

  1. 创建一个class包含你的参数:

    public class Test
    {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Country { get; set; }
    }
    
  2. 在控制器方法中使用模型绑定:

    public int ID { get; set; }
    
            [HttpPost]
            [Route("[action]")]
            public void GetDetails([FromBody] Test test)
            {
                ID = test.Id;
    
            }
    

  3. 发送Json到控制器:

    {
        "Id" : 5,
        "Name" : "Name from Json",
        "Country" : "USA"
    }
    

然后在APIaction方法中获取Id值