Post метод java-функций Azure, отправка данных формы - PullRequest
0 голосов
/ 01 октября 2018

Я следовал этому руководству здесь functions-create-first-java-maven

За исключением того, что я пытаюсь сделать, это просто иметь метод post и передавать данные формы втело запроса.

вот мой код функции

@FunctionName("create-request")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = { HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) final HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");
        context.getLogger().info("RequestBody:- " + request.getBody());
        final int keyIndex = request.getBody().toString().indexOf("request");
        if (keyIndex != -1) {
            final String restString = request.getBody().toString().substring(keyIndex);

            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + restString).build();

        }
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    }

Я пытаюсь с почтальоном enter image description here

ничего в ответ, но моя локальная консольпоказывает множество исключений,

Это, кажется, главная проблема здесь.

fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HLH77AHEFKOM", Request id "0HLH77AHEFKOM:00000001": An unhandled exception was thrown by the application.
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: Functions.create-request ---> Microsoft.Azure.WebJobs.Script.Rpc.RpcException: Result: Failure
Exception: Cannot locate the method signature with the given input
Stack: java.lang.NoSuchMethodException: Cannot locate the method signature with the given input
        at com.microsoft.azure.functions.worker.broker.JavaMethodExecutor.lambda$execute$0(JavaMethodExecutor.java:49)
        at java.util.Optional.orElseThrow(Optional.java:290)
        at com.microsoft.azure.functions.worker.broker.JavaMethodExecutor.execute(JavaMethodExecutor.java:49)
        at com.microsoft.azure.functions.worker.broker.JavaFunctionBroker.invokeMethod(JavaFunctionBroker.java:47)
        at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:33)
        at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:10)
        at com.microsoft.azure.functions.worker.handler.MessageHandler.handle(MessageHandler.java:45)
        at com.microsoft.azure.functions.worker.JavaWorkerClient$StreamingMessagePeer.lambda$onNext$0(JavaWorkerClient.java:91)
        at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1386)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

Но, интересно, когда я передаю те же данные, что и x-www-form-urlencoded, он работает просто отлично.

Итак, я хотел бы знать, нужно ли мне изменять параметры @HttpTrigger и передавать какую-то другую конфигурацию, чтобы указать, что функция должна поддерживать, form-data, а также urlencodedпуть ?Так как я предпочел бы передавать данные как данные формы, а не как urlencoded.Любые предложения приветствуются.

1 Ответ

0 голосов
/ 01 октября 2018

Кажется, что form-data тип контента в настоящее время не поддерживается функцией Httptrigger.

Мой обходной путь - мы могли бы добавить нашу логику для его обработки.

Мы могли бы получить контент-введите из заголовка запроса, затем обработайте значение самим

Ниже приведен демонстрационный код.

Map<String,String> headers = request.getHeaders();
if(headers.get("content-type").contains("multipart/form-data"))
{
    //add logic to handle the value
}
else if(headers.get("content-type").contains("application/x-www-form-urlencoded"))
{
     //add logic to handle the value       
}
...