Как выполнить POST в функцию Azure (HTTP-триггер) через Postman?

avatar
BoGoodSki
1 июля 2021 в 21:17
5709
2
0

Я реализовал функцию Azure, используя триггер HTTP, интегрированный с SendGrid. Предполагаемое действие — передать данные в функцию Azure через HTTP и отправить это содержимое по электронной почте в указанный почтовый ящик. Моя функция Azure прошла успешное тестирование на портале Azure. Другими словами, когда я отправляю это, в папку «Входящие» приходит ожидаемое электронное письмо:

.

enter image description here

Однако при попытке отправить POST в функцию Azure через Postman я получаю статус 400 «Неверный запрос — недопустимое имя хоста». Я попытался использовать свои функциональные клавиши, передав ключ в качестве параметра в моем URI в Postman и, альтернативно, в заголовке как «x-functions-key». Всегда статус 400. Я получаю URL-адрес для POST с портала Azure, нажав «Получить URL-адрес функции». В качестве альтернативы я также пробовал размещать сообщения по URL-адресу, соответствующему:

.

enter image description here

Вот мои привязки функций (function.json):

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "sendGrid",
      "name": "$return",
      "direction": "out",
      "apiKey": "SendGridKey",
      "from": "email@email.com",
      "to": "email@email.com"
    }
  ]
}

Вот логика функции (run.csx):

#r "Newtonsoft.Json"
#r "SendGrid"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using SendGrid.Helpers.Mail;

public static SendGridMessage Run(Email req, ILogger log)
{
    Guid Id = Guid.NewGuid(); 
            
    log.LogInformation($"Email generated from websitename via Azure Function. Email ID: {Id}");    

    SendGridMessage message = new SendGridMessage()
    {
        Subject = $"From wesbitename. Subj: {req.Subject.Substring(0, 20)}"
    };

    
    message.AddContent("text/plain", $"Subject: {req.Subject} \n \n" + $"{req.Content} \n \n" + $"From: {req.CustomerName}, {req.CustomerEmail}");
    return message;
}

public class Email
{
    public string EmailId { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }
    public string CustomerName { get; set; }
    public string CustomerEmail { get; set; }
}

Как выполнить POST в функцию Azure через HTTP? Как устранить ошибку 400? Спасибо!

Для получения дополнительной информации я обращаюсь за помощью также через твиттер: https://twitter.com/devbogoodski/status/1410702335303581697

Источник

Ответы (2)

avatar
BoGoodSki
2 июля 2021 в 03:21
0

В конечном счете, я не внес никаких изменений в функцию Azure, а вместо этого попробовал использовать для тестирования другой инструмент, а не Postman. Я использовал https://reqbin.com/. Отправил мой запрос POST с тем же телом JSON, которое я использовал, и получил код состояния 200, а содержимое было отправлено по электронной почте в указанный почтовый ящик. Итак, проблема была с Почтальоном, хотя на данный момент я точно не знаю, в чем. Я отменил выбор всех параметров заголовка, кроме тех, которые я намеревался использовать. И передал мой функциональный ключ через строку запроса в URL-адресе, как я делал в успешных тестах вне Postman, но это никогда не работало в Postman. Так что я не совсем уверен, что происходит. Но функция Azure работает. Так что считаю это решенным. Благодарим за внимание.

Если вам интересно больше об этом, я немного расширил это здесь: https://bogoodski.medium.com/setting-up-an-azure-function-sendgrid-http-trigger- cfd9c5791201

avatar
Lasanga Guruge
1 июля 2021 в 21:56
4

Поскольку вы используете HTTP-триггер, убедитесь, что ваш URL-адрес имеет следующий формат:

http://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>

Добавьте следующие заголовки:

x-functions-key: A function-specific API key is required. Default if specific is not provided
Content-Type: application/json

Затем добавьте объект json в тело

BoGoodSki
2 июля 2021 в 14:54
1

Спасибо. Это полезный ответ. Это не устраняет конкретную ошибку, с которой я столкнулся, но только потому, что я искал не то место - саму функцию - для источника ошибки, когда ошибка была на самом деле с программным обеспечением для тестирования Postman. Учитывая мой первоначальный вопрос, это полезный ответ. Так что спасибо тебе. Проголосовал :)