3
votes

Passer le paramètre à Azure Function (HttpTrigger) dans l'URL en tant que chaîne de requête

Création d'une nouvelle fonction Azure dans Visual Studio 2017 (basé sur HTTPTrigger) et difficulté à passer des paramètres avec une route personnalisée. Voici l'extrait de code:

        [FunctionName("RunTest")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "orchestrators/contoso_function01/{id:int}/{username:alpha}")]
        HttpRequestMessage req, TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            // parse query parameter
            string name = req.GetQueryNameValuePairs()
                .FirstOrDefault(q => string.Compare(q.Key, "id", true) == 0)
                .Value;

            string instanceId = req.GetQueryNameValuePairs()
              .FirstOrDefault(q => string.Compare(q.Key, "username", true) == 0)
              .Value;

            if (name == null)
            {
                // Get request body
                dynamic data = await req.Content.ReadAsAsync<object>();
                name = data?.name;
            }

            return name == null
                ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
                : req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
        }

J'ai essayé d'accéder à la fonction avec les URL ci-dessous, mais je n'ai pas pu récupérer les valeurs d'ID ou de nom d'utilisateur à partir de la chaîne de requête à l'aide de l'API GetQueryNameValuePairs (), car elle n'a que 0 éléments dans la collection:

http: // localhost: 7071 / api / orchestrators / contoso_function01 / 123 / abc http: // localhost: 7071 / api / orchestrators / contoso_function01 /? id = 123 & username = abc


0 commentaires

3 Réponses :


5
votes

Je ne sais pas si c'est la bonne façon de gérer un tel besoin de passer des paramètres pour les requêtes HTTP avec Azure Functions, mais si j'inclus des paramètres pour chacune des chaînes de requête avec des noms de paramètres correspondants (ce qui est apparemment obligatoire pour obtenir les liaisons work), il est automatiquement attribué avec la valeur transmise dans l'URL au paramètre respectif.

         [FunctionName("HttpRunSingle")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "orchestrators/contoso_function01/{id:int}/{username:alpha}")]
        HttpRequestMessage req, int id, string username,TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            return (id == 0 || string.IsNullOrEmpty(username))
                ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
                : req.CreateResponse(HttpStatusCode.OK, "Hello " + id + " " + username);
        }


0 commentaires

1
votes

vous pouvez le faire comme:

var query = System.Web.HttpUtility.ParseQueryString(req.RequestUri.Query);
string userid = query.Get("username");


0 commentaires

0
votes

J'ai essayé toutes sortes de choses. C'est la seule chose qui fonctionnerait pour moi. Cela fonctionne bien avec une URL comme celle-ci. https://www.bing.com?id=12345678955&test=12345

#r "System.Web"

Assurez-vous et ajoutez ceci avant d'utiliser des instructions pour que System.Web.HttpUtility.ParseQueryString fonctionne.

string RawUrl = url;
        int index = RawUrl.IndexOf("?");
        if (index > 0)
            RawUrl = RawUrl.Substring(index).Remove(0, 1);

        var query = System.Web.HttpUtility.ParseQueryString(RawUrl);
        userId = query.Get("id");


0 commentaires