Функция Azure не видит тело JSON, переданное из Shopify, должным образом

#azure #function #shopify #azure-powershell

#azure #функция #shopify #azure-powershell

Вопрос:

Я создаю процесс оформления заказа на основе приложения Azure function для магазина Shopify. Это мой первый раз, когда я работаю в рамках ограничений функций. Эта функция основана на powershell.

итак, функция была разработана локально, для этого я взял копию json-тела webhook (заказ / оплата с Shopify) с помощью hookbin, который является потрясающим инструментом. Затем я использовал postman для запуска тела в локальной копии функции при ее разработке. Это фрагмент примера shopifys:

 {
  "id": 820982911946154500,
  "email": "jon@doe.ca",
  "closed_at": null,
  "created_at": "2021-02-07T20:48:25 00:00",
  "updated_at": "2021-02-07T20:48:25 00:00",
  "number": 234,
  "note": null,
  ...
}
 

так что я работал с этим, казалось, достаточно легко. В моем powershell я выполнил довольно стандартную

 $RequestBody = $Request.Body | ConvertFrom-JSON
 

затем я выбираю то, что мне нужно.

 $email_address = $RequestBody.email
 

Это не работает, когда я объединяю Shopify и функцию вместе. В тот момент, когда я собираю текст запроса, я не получаю того же, что сделал hookbin.

когда я пытаюсь преобразовать json, я получаю следующее

 WARNING: Conversion from JSON failed with error: Unexpected character encountered while parsing value: S. Path '', line 0, position 0.
 

поэтому я пытаюсь сбросить тело как $Request.тело (до того, как я преобразовал в json) и получаю это

 INFORMATION: System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry 
 

итак, подводя итог, я явно не получил строгого JSON, которого ожидал.
Это первые несколько строк моей функции.

 param($Request, $TriggerMetadata)
try {
    $ErrorActionPreference = "Stop"
    Connect-AzAccount -Identity

    # $RequestBody = $Request.Body | convertfrom-json
    Write-host $Request.Body  
 

я пропускаю действительно очевидный шаг, который нужно выполнить в функции, который мне не нужно было делать при сборе тела с помощью hookbin?

Ответ №1:

Глядя на вывод

 Write-host $Request.Body  
 

Вывод :

 INFORMATION: System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry 
 

Похоже, у вас уже есть объект dictionary (пара ключ-значение).

если вам нужно получить доступ к значению email ключа you, вы можете напрямую получить к нему доступ как $request.body.email или $request.body["email"]

Прежде чем выполнять вышеуказанное, вы можете сначала попробовать следующие шаги :

Чтобы понять, какие ключи присутствуют. Соответственно, получите к ним доступ.Таким образом, вы можете попробовать выполнить Write-Host $request.body.Keys сброс всех ключей, связанных с объектом dictionary.

Комментарии:

1. это. я понял это примерно в то время, когда вы опубликовали сообщение, выполнив поиск на github кода других функций в ps. я не знаю, почему функции Azure собирают и преобразуют JSON для вас, но это то, что он делает. Спасибо.