How to pass parameters by POST to an Azure function?

前端 未结 9 1946
暗喜
暗喜 2020-12-24 05:27

I\'m trying to do a simple Azure Function to learn about it. There will be 3 functions:

  • 1 function to insert a row into a table of a database. This table will
相关标签:
9条回答
  • 2020-12-24 06:07

    I have done a very simple example to get data using POST request in Azure Function App. Please find the following example.

    using System;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.Azure.WebJobs.Host;
    
    namespace MyFunctions
    {
        public static class MyFunctionsOperations
        {
            [FunctionName("MyFunctionsOperations")]
            public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
            {
                log.Info("C# HTTP trigger function processed a request.");
                var headers = req.Headers;
                string collection = headers.GetValues("collection").First();   //getting parameter from header
    
                CosmosdbOperation obj = new CosmosdbOperation();
                dynamic data = await req.Content.ReadAsAsync<object>();  //getting body content
                Boolean response = await obj.MyFunctionExecution(data.ToString(), collection);
    
                return (response)
                    ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a proper argument in the request body")
                    : req.CreateResponse(HttpStatusCode.OK, "Operation successfully executed..");
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-24 06:09

    It can be done in following way with custom class

    Azure Function

    [FunctionName("PostParameterFunction")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
       {
          log.LogInformation("C# HTTP trigger function processed a request.");
    
           try
            {
                 // Convert all request perameter into Json object
    
                    var content = req.Content;
                    string jsonContent = content.ReadAsStringAsync().Result;
                    dynamic requestPram = JsonConvert.DeserializeObject<RequestModel>(jsonContent);
    
                    // Validate the required param
    
                    if (string.IsNullOrEmpty(requestPram.FirstName))
                    {
                        return req.CreateResponse(HttpStatusCode.OK, "Please enter First Name!");
                    }
                    if (string.IsNullOrEmpty(requestPram.LastName))
                    {
                        return req.CreateResponse(HttpStatusCode.OK, "Please enter Last Name!");
                    }
    
    
                    //Create object for partner Model to bind the response on it
    
                    RequestModel objRequestModel = new RequestModel();
    
                    objRequestModel.FirstName = requestPram.FirstName;
                    objRequestModel.LastName = requestPram.LastName;
    
                    //Return Request Model
    
                    return req.CreateResponse(HttpStatusCode.OK, objRequestModel);
             }
            catch (Exception ex)
             {
    
                    return req.CreateResponse(HttpStatusCode.OK, "Cannot Create Request! Reason: {0}", string.Format(ex.Message));
             }
    
            }
    

    Request Class:

     public class RequestModel
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
    
        }
    

    Request Input:

    {
        "FirstName": "Kiron",
        "LastName":"Test"
    }
    

    PostMan Output Example:

    0 讨论(0)
  • 2020-12-24 06:12

    In case google took you here, this is how it's done in March 2019 (Azure Functions v3):

    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);
                
            }
    
    0 讨论(0)
  • 2020-12-24 06:13

    For passing parameters as POST request, you need to do following things:

    1. Make Json model of the parameters that u need to pass,ex:

      {"UserProfile":{ "UserId":"xyz1","FirstName":"Tom","LastName":"Hank" }}
      
    2. Post your data model using client like POSTMAN

    3. Now you will get the posted content in HttpRequestMessage body, sample code is as follows:

      [FunctionName("TestPost")]
      public static HttpResponseMessage POST([HttpTrigger(AuthorizationLevel.Function, "put", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
      {
          try
          {
              //create redis connection and database
              var RedisConnection = RedisConnectionFactory.GetConnection();
              var serializer = new NewtonsoftSerializer();
              var cacheClient = new StackExchangeRedisCacheClient(RedisConnection, serializer);
      
              //read json object from request body
              var content = req.Content;
              string JsonContent = content.ReadAsStringAsync().Result;
      
              var expirytime = DateTime.Now.AddHours(Convert.ToInt16(ConfigurationSettings.AppSettings["ExpiresAt"]));
      
              SessionModel ObjModel = JsonConvert.DeserializeObject<SessionModel>(JsonContent);
              bool added = cacheClient.Add("RedisKey", ObjModel, expirytime); //store to cache 
      
              return req.CreateResponse(HttpStatusCode.OK, "RedisKey");
          }
          catch (Exception ex)
          {
              return req.CreateErrorResponse(HttpStatusCode.InternalServerError, "an error has occured");
          }
      }
      
    0 讨论(0)
  • 2020-12-24 06:15

    You need to attach data to the body of the post request and process it properly:

    public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) {
        // This reads your post request body into variable "data"
        string data = await req.Content.ReadAsStringAsync();
        // Here you can process json into an object
        dynamic parsed = JsonConvert.DeserializeObject(data);
    
        return exitstring == null
            ? req.CreateResponse(HttpStatusCode.BadRequest, "Something went wrong, sorry")
            : req.CreateResponse(HttpStatusCode.OK);
    }
    

    You can find a slightly different example here and the exact example here.

    0 讨论(0)
  • 2020-12-24 06:20

    To get the request content from the request body(post request), you could use req.Content.ReadAsAsync method. Here is the code sample.

    Sample request body.

    {
        "name": "Azure"
    }
    

    Define a class to deserialize the post data.

    public class PostData
    {
        public string name { get;set; }    
    }
    

    Get the post data and display it.

    PostData data = await req.Content.ReadAsAsync<PostData>();
    log.Info("name:" + data.name);
    

    Client side code to send the post request.

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("function-url");
    req.Method = "POST";
    req.ContentType = "application/json";
    Stream stream = req.GetRequestStream();
    string json = "{\"name\": \"Azure\" }";
    byte[] buffer = Encoding.UTF8.GetBytes(json);
    stream.Write(buffer,0, buffer.Length);
    HttpWebResponse res = (HttpWebResponse)req.GetResponse();
    
    0 讨论(0)
提交回复
热议问题