16
votes

I tried the following:

/// <summary>
/// Request the Facebook Token
/// </summary>
[FunctionName("SolicitaFacebookToken")]
[Route("SolicitaToken/?fbAppID={fbAppID}&fbCode={fbCode}&fbAppSecret={fbAppSecret}")]
public static async Task<HttpResponseMessage> SolicitaFacebookToken(
    [HttpTrigger(AuthorizationLevel.Function, methods: new string[] { "get" } )]
    HttpRequestMessage req,
    TraceWriter log,
    string fbAppID,
    string fbCode,
    string fbAppSecret
)
{ }

When I access the URL:

http://localhost:7071/api/SolicitaFacebookToken/?fbAppID=ABC&fbCode=DEF&fbAppSecret=GHI

But it gives these errors:

'SolicitaFacebookToken' can't be invoked from Azure WebJobs SDK. Is it missing Azure WebJobs SDK attributes?
System.InvalidOperationException : 'SolicitaFacebookToken' can't be invoked from Azure WebJobs SDK. Is it missing Azure WebJobs SDK
attributes?
 at Microsoft.Azure.WebJobs.JobHost.Validate(IFunctionDefinition function,Object key)
 at async Microsoft.Azure.WebJobs.JobHost.CallAsync(??)
 at async Microsoft.Azure.WebJobs.Script.ScriptHost.CallAsync(String method,Dictionary\`2 arguments,CancellationToken cancellationToken)
 at async Microsoft.Azure.WebJobs.Script.WebHost.WebScriptHostManager.HandleRequestAsync(FunctionDescriptor function,HttpRequestMessage request,CancellationToken cancellationToken)
 at async Microsoft.Azure.WebJobs.Script.Host.FunctionRequestInvoker.ProcessRequestAsync(HttpRequestMessage request,CancellationToken cancellationToken,WebScriptHostManager scriptHostManager,WebHookReceiverManager webHookReceiverManager)
 at async Microsoft.Azure.WebJobs.Script.WebHost.Controllers.FunctionsController.<>c__DisplayClass3_0.<ExecuteAsync>b__0(??)
 at async Microsoft.Azure.WebJobs.Extensions.Http.HttpRequestManager.ProcessRequestAsync(HttpRequestMessage request,Func`3 processRequestHandler,CancellationToken cancellationToken)
 at async Microsoft.Azure.WebJobs.Script.WebHost.Controllers.FunctionsController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken)
 at async System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
 at async System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
 at async Microsoft.Azure.WebJobs.Script.WebHost.Handlers.WebScriptHostHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
 at async Microsoft.Azure.WebJobs.Script.WebHost.Handlers.SystemTraceHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
 at async System.Web.Http.HttpServer.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)

If I change to this:


HttpRequestMessage req,
string fbAppID,
string fbCode,
string fbAppSecret,
TraceWriter log

The following 1 functions are in error:

SolicitaFacebookToken: Microsoft.Azure.WebJobs.Host: Error indexing method 'Function1.SolicitaFacebookToken'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'fbAppID' to type String. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. config.UseServiceBus(), config.UseTimers(), etc.).

In Azure Functions template code, there is

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

I would like a simpler way to get the GET query parameters.

I want to have a URL like this:

http://localhost:7071/api/SolicitaFacebookToken/?fbAppID=123&fbCode=456&fbAppSecret=789

Q: How can I easily get the parameters and its values?

5

5 Answers

23
votes

In the past when I have multiple parameters I've added them to the route. So instead of this:

[Route("SolicitaToken/?fbAppID={fbAppID}&fbCode={fbCode}&fbAppSecret={fbAppSecret}")]

I've done something like this:

[Route("SolicitaToken/{fbAppID}/{fbCode}/{fbAppSecret}")]

Then you don't need to access the query string at all and can use the function parameters directly.

[FunctionName("Function1")]
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "HttpTriggerCSharp/name/{fbAppID}/{fbCode}/{fbAppSecret}")]HttpRequestMessage req, string fbAppID, string fbCode, string fbAppSecret, TraceWriter log)
{
  log.Info("C# HTTP trigger function processed a request.");
  var msg = $"App ID: {fbAppID}, Code: {fbCode}, Secret: {fbAppSecret}";
  // Fetching the name from the path parameter in the request URL
  return req.CreateResponse(HttpStatusCode.OK, msg);
}
20
votes

For v2/beta/.NET Core runtime, you can be specific and do:

string fbAppID = req.Query["fbAppID"];

or more generic with:

using System.Collections.Generic;
...
IDictionary<string, string> queryParams = req.GetQueryParameterDictionary();
// Use queryParams["fbAppID"] to read keys from the dictionary.

For v1 function apps (.NET Full Framework):

using System.Collections.Generic;
...
IDictionary<string, string> queryParams = req.GetQueryNameValuePairs()
    .ToDictionary(x => x.Key, x => x.Value);
// Use queryParams["fbAppID"] to read keys from the dictionary.
12
votes

In v2 runtime, an alternative way to get query params:

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

Hope this helps.

1
votes

you can get all query parameters like:

   foreach (var q in req.Query)
   {
     log.LogWarning($"Query param Key {q.Key} has value {q.Value}"); 
   }
1
votes

Azure Functions Runtime v3:

 var query = System.Web.HttpUtility.ParseQueryString(req.Url.Query);