Como passar um array para a API

Em algumas chamadas de API, você deve passar um array de valores nos dados da solicitação POST. Como fazer isso?

Descobri, por tentativa e erro, como passar um array com um único item — por exemplo, para change-owner, você precisa de algo como:

username: sean-finnegan
post_ids[]: 925

(ou, em formato codificado na URL)

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

Ótima pergunta, concordo que isso pode ser um pouco confuso. Se você quiser passar vários post_ids, você deve enviar vários campos de dados de formulário para post_ids[], como neste exemplo de 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"

Olá Blake,

Essa ainda é a maneira recomendada de enviar um array para a API? Estou tentando criar um webhook e não consigo enviar o parâmetro de array web_hook_event_type_ids.

Tentei com CURL (como 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"

# Recebo
{"errors":["param is missing or the value is empty: web_hook"]}%

E com httpie (como 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]'

# Recebo
{
    "errors": [
        "Web hook event types can't be blank"
    ]
}

Parece que todo esse endpoint exige os valores em um parâmetro aninhado web_hook:

Não sou muito fã desse formato aninhado, e há alguns endpoints como esse na minha lista futura para corrigir. Você pode fazer uma chamada de API a ele usando form-data da seguinte forma:

Observe como cada parâmetro tem a sintaxe de “array” web_hook[payload_url]. Se você estiver enviando sua solicitação com JSON, ficará assim:

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

Ah, muito obrigado. Não era isso que estava escrito na API do Discourse, então eu estava ficando maluco. :sweat_smile:

Além disso, notei que definir web_hook_event_type_ids com pelo menos um item é obrigatório, mesmo que eu acabe usando wildcard_web_hook=true. Isso também me deixou confuso por um tempo.