Как передать массив в API

В некоторых вызовах API от вас ожидается передача массива значений в POST-данных. Как это сделать?

Я методом проб и ошибок выяснил, как передать массив с одним элементом — например, для change-owner вам нужно что-то вроде:

username: sean-finnegan
post_ids[]: 925

(или в URL-кодированном виде)

post_ids%5B%5D=925&username=sean-finnegan

Отличный вопрос, согласен, это может быть немного запутанно. Если вы хотите передать несколько post_ids, вам нужно передать несколько полей формы для post_ids[], как в примере curl:

curl -i -sS -X POST "http://localhost:8080/t/15/change-owner.json" 
-H "Api-Key: api-key" \
-H "Api-Username: system" \
-F "username=blake" \
-F "post_ids[]=29" \
-F "post_ids[]=30"

Привет, Блейк,

Это по-прежнему рекомендуемый способ отправки массива в API? Я пытаюсь создать веб-хук, но не могу передать параметр массива web_hook_event_type_ids.

Я пробовал это с помощью CURL (как multipart/form-data):

curl -X POST "https://MYSITE.com/admin/api/web_hooks" \
  -H "Api-Key: KEY" \
  -H "Api-Username: USER" \
  -F "payload_url=https://MYOTHERSITE.com" \
  -F "content_type=1" \
  -F "wildcard_web_hook=false" \
  -F "verify_certificate=true" \
  -F "active=true" \
  -F "web_hook_event_type_ids[]=2"

# Я получаю
{"errors":["param is missing or the value is empty: web_hook"]}%

А также с помощью httpie (как application/json):

http POST https://MYSITE.com/admin/api/web_hooks \
  Api-Key:KEY \
  Api-Username:USER \
  payload_url=https://MYOTHERSITE.com \
  content_type=1 \
  wildcard_web_hook:=false \
  verify_certificate:=true \
  active:=true \
  web_hook_event_type_ids:='[2]'

# Я получаю
{
    "errors": [
        "Web hook event types can't be blank"
    ]
}

Похоже, что этот endpoint требует значения в виде вложенного параметра web_hook:

Мне не очень нравится такой вложенный формат, и есть несколько подобных endpoint’ов, которые я в конечном итоге планирую исправить. Вы можете вызвать этот API с помощью form-data следующим образом:

Обратите внимание, что каждый параметр использует синтаксис массива web_hook[payload_url]. Если вы отправляете запрос в формате JSON, он будет выглядеть так:

{
  "web_hook": {
    "payload_url": "https://example.com/hello",
    "content_type": "1",
    ...
  }
} 

Ах, большое спасибо. В Discourse API написано совсем другое, поэтому я уже совсем запутался. :sweat_smile:

Кроме того, я заметил, что параметр web_hook_event_type_ids должен содержать хотя бы один элемент, даже если я в итоге использую wildcard_web_hook=true. Это тоже какое-то время ставило меня в тупик.