Cómo pasar un array a la api

En algunas llamadas a la API, se espera que envíes un array de valores en los datos POST. ¿Cómo se hace esto?

Mediante prueba y error, he descubierto cómo pasar un array con un solo elemento. Por ejemplo, para change-owner, necesitas algo como:

username: sean-finnegan
post_ids[]: 925

(o, en formato codificado para URL)

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

Excelente pregunta, coincido en que puede resultar un poco confuso. Si deseas pasar varios post_ids, deberías incluir varios campos de datos de formulario para post_ids[], como se muestra en este ejemplo con 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"

¡Hola Blake,

¿Sigue siendo esta la forma recomendada de enviar un array a la API? Estoy intentando crear un webhook y no logro enviar el parámetro de array web_hook_event_type_ids.

Lo he probado con 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"

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

Y con 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]'

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

Parece que todo este endpoint requiere los valores en un parámetro anidado web_hook:

No soy muy fanático de este formato anidado, y hay varios endpoints como este en mi lista eventual para corregir. Puedes hacer una llamada a la API usando form-data de la siguiente manera:

Fíjate cómo cada parámetro tiene la sintaxis de “array” web_hook[payload_url]. Si envías tu solicitud con JSON, se verá así:

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

¡Ah, muchas gracias! Eso no es lo que decía en la API de Discourse, así que estaba volviéndome loco. :sweat_smile:

Además, he notado que es obligatorio establecer web_hook_event_type_ids con al menos un elemento, incluso si al final uso wildcard_web_hook=true. Eso también me dejó con la cabeza rota durante un tiempo.