Почему ответ 400 от конечной точки Azure для Postman, но прекрасно работает с консолью Alexa? - PullRequest
0 голосов
/ 05 ноября 2018

Я новичок в разработке навыков Alexa, поэтому я использую пример, который я нашел в Интернете, в качестве конечной точки C #, размещенной в Azure. Он работает правильно с консолью Alexa, но когда я пытаюсь протестировать ту же конечную точку с приложением Postman, я получаю ошибку 400.

Когда я использую консоль Alexa, она отображает входные данные JSON, которые она отправляет конечной точке, и выходные данные JSON, которые она получает от конечной точки. Если я скопирую входные данные JSON, вставлю их в Postman и отправлю в ту же конечную точку, я получу ошибку 400. Очевидно, я что-то упустил.

Ниже приведены два моих исходных файла и вход JSON.

RollTheDice.cs

public static class RollTheDice
{
    [FunctionName("RollTheDice")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
    log.Info("C# HTTP trigger function processed a request.");

    var speechlet = new RollTheDiceSpeechlet();
    return await speechlet.GetResponseAsync(req);
    }
}

RollTheDiceSpeechlet.cs

public class RollTheDiceSpeechlet : SpeechletBase, ISpeechletWithContext
{
  public SpeechletResponse OnIntent(IntentRequest intentRequest, Session session, Context context)
  {
    try
    {
      // Default to 6 sides if not specified
      if (!int.TryParse(intentRequest.Intent.Slots["DiceType"].Value, out int numSides))
        numSides = 6;

      var rollResults = new Random().Next(Math.Max(1, numSides - 1)) + 1; // Account for random returning '0'
      return new SpeechletResponse
      {
        ShouldEndSession = false,
        OutputSpeech = new PlainTextOutputSpeech { Text = $"I rolled a {numSides} sided die and got a {rollResults}." }
      };
    }
    catch (Exception ex)
    {
      return new SpeechletResponse
      {
        ShouldEndSession = false,
        OutputSpeech = new PlainTextOutputSpeech { Text = ex.Message }
      };
    }

  }

  public SpeechletResponse OnLaunch(LaunchRequest launchRequest, Session session, Context context)
  {
    return new SpeechletResponse
    {
      ShouldEndSession = false,
      OutputSpeech = new PlainTextOutputSpeech { Text = "Welcome to the Roll the Dice. Ask me to roll the dice." }
    };
  }

  public void OnSessionEnded(SessionEndedRequest sessionEndedRequest, Session session, Context context)
  {
    return;
  }

  public void OnSessionStarted(SessionStartedRequest sessionStartedRequest, Session session, Context context)
  {
    return;
  }
}

JSON Input

Опять же, все работает нормально, но когда я тестирую его с почтальоном, я получаю ошибку 404. Конечной точкой является C # -серверная функция, которую я разработал в Visual Studio 201. Когда я запускаю его локально, я копирую / вставляю URL в приложение «Почтальон» и отправляю сообщение. Смотрите прикрепленные скриншоты.

enter image description here enter image description here

1 Ответ

0 голосов
/ 06 ноября 2018

Как показывает ошибка, у вас отсутствуют заголовки Signature и SignatureCertChainUrl. Это помогает защитить вашу конечную точку и убедиться, что входящие запросы были отправлены Alexa. Любые запросы, поступающие из других источников, должны быть отклонены. Когда вы тестируете его через Test Console, эти заголовки включаются, и вы получаете успешный ответ.

Заголовки:

Signature 
SignatureCertChainUrl

Проверка входящих запросов состоит из двух частей:

  1. Проверьте подпись запроса, чтобы проверить подлинность запроса.
  2. Проверьте метку времени запроса, чтобы убедиться, что запрос не является старым запросом.

Больше информации о том, что запрос был отправлен Alexa здесь

...