programing

Azure 함수에서 간단한 방법으로 GET 쿼리 매개 변수를 가져오는 방법은 무엇입니까?

newstyles 2023. 5. 4. 19:42

Azure 함수에서 간단한 방법으로 GET 쿼리 매개 변수를 가져오는 방법은 무엇입니까?

다음을 시도했습니다.

/// <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
)
{ }

URL에 액세스할 때:

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

그러나 다음과 같은 오류가 발생합니다.

'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)

변경할 경우:


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

다음 1개의 함수에 오류가 있습니다.

Facebook 요청토큰: 마이크로소프트.애저, 웹잡스호스트: 인덱싱 메서드 'Function1'에서 오류가 발생했습니다.Facebook 요청'토큰'. 마이크로소프트.애저, 웹잡스호스트: 'fbApp 매개 변수를 바인딩할 수 없습니다.String을 입력하려면 'ID'를 입력합니다.매개 변수 유형이 바인딩에서 지원되는지 확인합니다.바인딩 확장(예: ServiceBus, Timers 등)을 사용하는 경우 시작 코드(예: 구성)에서 확장에 대한 등록 방법을 호출했는지 확인합니다.서비스 버스(), 구성을 사용합니다.타이머( 등)를 사용합니다.

Azure Functions 템플릿 코드에는 다음이 있습니다.

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

GET 쿼리 매개 변수를 얻는 더 간단한 방법을 원합니다.

다음과 같은 URL을 원합니다.

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

Q: 매개 변수와 값을 쉽게 얻을 수 있는 방법은 무엇입니까?

이전에는 매개 변수가 여러 개 있는 경우 경로에 매개 변수를 추가했습니다.그래서 이것 대신에:

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

저는 다음과 같은 일을 했습니다.

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

그러면 쿼리 문자열에 액세스할 필요가 전혀 없으며 함수 매개 변수를 직접 사용할 수 있습니다.

[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);
}

v2/beta/의 경우.NET Core 런타임, 구체적으로 지정하여 다음을 수행할 수 있습니다.

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

또는 다음을 포함하는 더 일반적:

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

v1 기능 앱(.NET 전체 프레임워크):

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.

v2 런타임에서 쿼리 매개 변수를 가져오는 대체 방법:

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

이게 도움이 되길 바랍니다.

get 메서드에서 쿼리 매개 변수를 처리하는 가장 간단한 방법은 PoCo 개체를 정의하고 사용하는 것입니다.[FromQuery]내가 사용된 것 같은 속성.Net Web API.

불행하게도 HTTP 트리거 Azure 함수를 사용하여 이를 수행하기 위한 초기 접근 방식은 원래 질문에 설명된 것과 동일한 예외로 이어집니다.

구글 검색을 좀 한 후에,모든 참조(적어도 내가 찾은 참조)가 불가능하다고 명시하거나 단순히 경로 구성을 사용하거나 요청 개체에서 쿼리 매개 변수를 가져오거나 GET을 사용하지 않고 POST 요청을 사용하여 요청 본문의 일부로 전달할 내용을 전달하기를 기대하기 때문에 모든 희망을 버리려고 했습니다.

이 모든 것이 실제로 만족스럽지 못했기 때문에 함수에 대한 GET 요청에 사용하려는 POCO 개체에 대해 자체 사용자 지정 BindingProvider를 구현하려고 했습니다.

그런 다음 zure-webjobs-sdk-extensions의 소스를 자세히 살펴보니 다음과 같습니다.HttpDirectRequestBinding 공급자

해당 클래스에 대한 의견:

// support allowing binding any non-attributed HttpRequest parameter to the incoming http request. 
//    Foo([HttpTrigger] Poco x, HttpRequest y); 

다음은 실제로 지원되며 예상대로 작동하는 것으로 나타났습니다.

Tl;Dr;

마법 바인딩이 시작될 수 있도록 HttpTrigger Attribute가 Poco 객체 파라미터에 적용되었는지 확인합니다!

public async Task<IActionResult> Foo([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
    PaginationFilter paginationFilter, HttpRequest req, ClaimsPrincipal principal, CancellationToken cancellationToken)

PaginationFilter됩니다.

이것은 단지 예시일 뿐입니다.JSON 직렬화가 가능하고 기본 생성자가 있는 경우 함수 서명에서 PoCo와 유사한 유형을 사용할 수 있습니다.

public record PaginationFilter(Int32 Limit, Int32 Page)
{
    public PaginationFilter()
        : this(Constants.DefaultPageSize, 1)
    { }
}

이 서명을 사용하여 지원되는 쿼리:

http://localhost:7071/api/Foo?Limit=50&Page=1
or
http://localhost:7071/api/Foo?Limit=50
or
http://localhost:7071/api/Foo?Page=1
or
http://localhost:7071/api/Foo

또한 Azure-Functions GitHub 문제에 대한 관련 질문에 대한 나의 원래 답변 보기

원래 질문에 대한 답변

따라서 원래 질문에 답하려면 다음과 같은 전송 개체를 만들면 됩니다.

public class TokenSecrets
{
    public TokenSecrets() {}
    public string FbAppID {get; set;}
    public string FbCode {get; set;}
    public string FbAppSecret {get; set;}
}

함수 호출을 다음과 같이 조정할 수 있습니다.

public static async Task<HttpResponseMessage> SolicitaFacebookToken(
    [HttpTrigger(AuthorizationLevel.Function, methods: new string[] { "get" } )]
    TokenSecrets secrets,
    HttpRequestMessage req,
    TraceWriter log
)
{ 
    // and access the query parameters like:
    var id = secrets.FbAppId;
    ...
}

API가 호출되는 방식을 변경하지 않고 사용할 수 있습니다.

Azure 함수 런타임 v3:

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

다음과 같은 모든 쿼리 매개 변수를 가져올 수 있습니다.

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

에는 당의기능당사수있다습니용할신은서신에▁use▁in를 사용할 수 .HttpRequestMessage requestMessage또는HttpRequest request위에 사용된 첫 번째 것을 보았지만, 후자는 다음을 지원합니다.request.Query["myParameter"]통사론

언급URL : https://stackoverflow.com/questions/49833056/how-to-get-the-get-query-parameters-in-a-simple-way-in-azure-functions