Wie übergibt man ein Array an die API?

Bei einigen API-Aufrufen müssen Sie ein Array von Werten in den POST-Daten übergeben. Wie geht das?

Durch Ausprobieren habe ich herausgefunden, wie man ein Array mit einem Element übergeben kann – zum Beispiel bei change-owner möchten Sie Folgendes:

username: sean-finnegan
post_ids[]: 925

(oder in URL-kodierter Form)

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

Tolle Frage, ich stimme zu, das kann etwas verwirrend sein. Wenn Sie mehrere post_ids übergeben möchten, geben Sie mehrere Formularfelder für post_ids[] wie in diesem curl-Beispiel an:

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"

Hey Blake,

ist dies immer noch der empfohlene Weg, ein Array an die API zu senden? Ich versuche, einen Webhook zu erstellen, kann aber den Parameter web_hook_event_type_ids (Array) nicht senden.

Ich habe es mit CURL (als multipart/form-data) versucht:

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"

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

Und mit httpie (als 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]'

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

Es sieht so aus, als ob dieser gesamte Endpunkt die Werte in einem verschachtelten web_hook-Parameter erwartet:

Ich bin kein großer Fan dieses verschachtelten Formats, und es gibt einige Endpunkte wie diesen, die auf meiner Liste für eine spätere Korrektur stehen. Sie können einen API-Aufruf dafür mit Form-Daten wie folgt durchführen:

Beachten Sie, dass jeder Parameter die “Array”-Syntax web_hook[payload_url] hat. Wenn Sie Ihre Anfrage mit JSON senden, sieht es so aus:

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

Ah, vielen Dank. Das stand so nicht in der Discourse-API, also war ich völlig verwirrt. :sweat_smile:

Außerdem habe ich festgestellt, dass die Angabe von mindestens einem Element in web_hook_event_type_ids erforderlich ist, selbst wenn ich am Ende wildcard_web_hook=true verwende. Das hat mich auch eine Weile ratlos gelassen.