【问题标题】:How to pass parameters by POST to Azure Functions 2如何通过 POST 将参数传递到 Azure Functions 2
【发布时间】:2019-10-17 11:25:07
【问题描述】:

我想将参数传递给 Azure 函数 2 中的 HttpTrigger 类型。我在下面的链接中看到了 Azure 函数 1 的答案。

How to pass parameters by POST to an Azure function?

以上链接中的答案是await req.Content.ReadAsAsync<>(); 我正在寻找 Azure Function 2 的类似答案。

这里我们使用 HttpRequest 类而不是 HttpRequestMessage 类。

下面是代码。

public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            string data = .............;
        }

【问题讨论】:

    标签: c# azure post azure-functions


    【解决方案1】:

    首先根据 HTTP 请求创建 Azure Function Project(或添加到您的解决方案)。扳机。在创建项目的单个类中,您可以看到示例。您从请求正文中传递了 JSON:

    {"name":"John"}
    

    只需将其转换为代码中的变量:

     public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
    
           
    
            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            string name = data.name;
            ...
    

    【讨论】:

      【解决方案2】:

      您似乎正在尝试向Azure Function V2 发送POST 请求。见下面代码sn-p。

      自定义请求类:

      public class Users
          {
      
              public string Name { get; set; }
              public string Email { get; set; }
      
          }
      

      Azure 函数 V2:

      在此示例中,我使用自定义类获取两个参数,并将这两个类属性作为响应返回。

      public static async Task<IActionResult> Run(
                  [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
                  ILogger log)
              {
                  log.LogInformation("C# HTTP trigger function processed a request.");
      
                  //Read Request Body
                  var content = await new StreamReader(req.Body).ReadToEndAsync();
      
                  //Extract Request Body and Parse To Class
                  Users objUsers = JsonConvert.DeserializeObject<Users>(content);
      
                  //As we have to return IAction Type So converting to IAction Class Using OkObjectResult We Even Can Use OkResult
                  var result = new OkObjectResult(objUsers);
                  return (IActionResult)result;
              }
      

      索取样品:

      {
         "Name": "Kiron" ,
         "Email": "kiron@email.com"
      }
      

      邮递员测试:

      注意: 您实际上正在寻找await req.Content.ReadAsAsync&lt;&gt;(); 从您的函数发送POST 请求所需的。并从 该服务器响应。但请记住,req.Content 不支持阅读 Azure Function V2 中的帖子请求,其中显示了 Function V1 示例 here

      另一个例子:

      见下面代码sn-p:

      public static async Task<IActionResult> Run(
                  [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
                  ILogger log)
              {
                  log.LogInformation("C# HTTP trigger function processed a request.");
      
                  //Read Request Body
                  var content = await new StreamReader(req.Body).ReadToEndAsync();
      
                  //Extract Request Body and Parse To Class
                  Users objUsers = JsonConvert.DeserializeObject<Users>(content);
      
                  //Post Reuqest to another API 
                  HttpClient client = new HttpClient();
                  var json = JsonConvert.SerializeObject(objUsers);
                  //Parsing json to post request content
                  var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");
                  //Posting data to remote API
                  HttpResponseMessage responseFromApi = await client.PostAsync("YourRequstURL", stringContent);
      
                  //Variable for next use to bind remote API response
                  var remoteApiResponse = "";
                  if (responseFromApi.IsSuccessStatusCode)
                  {
                     remoteApiResponse = responseFromApi.Content.ReadAsStringAsync().Result; // According to your sample, When you read from server response
                  }
      
                  //As we have to return IAction Type So converting to IAction Class Using OkObjectResult We Even Can Use OkResult
                  var result = new OkObjectResult(remoteApiResponse);
                  return (IActionResult)result;
              }
      

      希望您理解,如果您仍有任何疑问,请随时分享。谢谢,编码愉快!

      【讨论】:

      • dynamic 使用自定义 DTO 有什么好处,例如 JObject
      • @l--''''''------'''''''''''' 据我所知,你也可以使用动态因为它是类型安全的,但如果您已经知道会出现什么样的数据,那么最好使用它。当我们使用动态编译器时,需要搜索每个数据类型,这有点昂贵。
      【解决方案3】:
      public static async void Run(
                  [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]
                  HttpRequest req,
                  ILogger log)
              {
                  var content = await new StreamReader(req.Body).ReadToEndAsync();
      
                  MyClass myClass = JsonConvert.DeserializeObject<MyClass>(content);
      
              }
      

      你可以有一个自定义类,它可以从 post 请求中以 JSON 的形式发送。

      【讨论】:

        猜你喜欢
        • 2015-09-28
        • 2019-05-28
        • 1970-01-01
        • 2017-07-02
        • 2018-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多