PUT Request (REST Api)

FreddyCollin

Ensign
Registriert
Dez. 2014
Beiträge
236
Hi,

ich übe gerade ein bisschen API Gerangel. Ich habe eine WebApp entdeckt mit der man eigene Apps (sogenannte Smaps) erstellen kann. Außerdem bietet die WebApp eine API Dokumentation wo man per API verschiedene sachen einsehen & editieren kann.
Um sie einzusehen, einfach auf den Link klicken und oben "/intern" auswählen:
788588


Nun möchte ich eine DatenSourceId - dies ist ein Wert innerhalb der Definition einer Smap - ändern.
Mein bisheriges Vorgehen:
788587

- Ich hole mir erst von der Smap/dem Formular per GET (1 auf dem Screenshot) den Responsebody. Der sieht so aus:
JSON:
{
  "deletedDate": null,
  "createdDate": "2019-05-14T15:09:15.3045908Z",
  "id": "ABCDEFGEHIJKM12345",
  "smapVersion": "0.0",
  "revision": 21,
  "subscriptionId": "ABCDEFGEHIJKM12345",
  "smapId": "ABCDEFGEHIJKM12345",
  "serverSettings": {
    "exportTemplateDisabled": true,
    "exportTemplate": {
      "assetId": "ABCDEFGEHIJKM12345",
      "description": "ralf_AbholungNEU.docx",
      "size": 87133,
      "lastModified": "2019-05-31T09:57:41.1226484Z",
      "contentType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      "checkSum": "85523c3554a0cf840c216e91d0de6a7d"
    },
    "exportFilenamePattern": null
  },
  "globalDataSources": null,
  "version": 1,
  "manifest": {
    "appName": "smapA",
    "logo": {
      "assetId": "afbbf51f-5531-440c-9fa4-54ce9a0fd182",
      "description": "logo.png",
      "size": 1382,
      "lastModified": "2019-05-14T15:09:15.3045908Z",
      "contentType": "image/png",
      "checkSum": "25e8b7e56f181895c1449e6d557e4f3e"
    },
    "author": "freddycollin@gmail.com",
    "description": null,
    "tags": null,
    "keyFacts": null,
    "runtimeVersion": "1.57.0.0"
  },
  "pages": [
    {
      "brickId": "Page",
      "type": "Page",
      "includeInExport": true,
      "excludeLabelInExport": true,
      "exportOnNewPage": true,
      "exportLabel": "",
      "exportIfEmpty": false,
      "sections": [
        {
          "brickId": "Section",
          "type": "Section",
          "includeInExport": true,
          "excludeLabelInExport": false,
          "exportOnNewPage": false,
          "exportIfEmpty": false,
          "exportLabel": "",
          "label": "Abschnitt",
          "bricks": [
            {
              "brickId": "DataRecordSelect",
              "type": "DataRecordSelect",
              "tableData": {
                "columns": [
                  {
                    "columnId": "Box1",
                    "dataType": "String",
                    "isValue": true,
                    "canSearch": true,
                    "displayDetail": true,
                    "displayResult": true
                  },
                  {
                    "columnId": "Box2",
                    "dataType": "String",
                    "isValue": true,
                    "canSearch": true,
                    "displayDetail": true,
                    "displayResult": true
                  },
                  {
                    "columnId": "Box3",
                    "dataType": "String",
                    "isValue": true,
                    "canSearch": true,
                    "displayDetail": true,
                    "displayResult": true
                  },
                  {
                    "columnId": "Box4",
                    "dataType": "String",
                    "isValue": true,
                    "canSearch": true,
                    "displayDetail": true,
                    "displayResult": false
                  },
                  {
                    "columnId": "Box5",
                    "dataType": "String",
                    "isValue": true,
                    "canSearch": true,
                    "displayDetail": true,
                    "displayResult": false
                  }
                ],
                "dataSource": {
                  [B]"dataSourceId": "AAAAAAAAAAAAAAAAA",[/B]
                  "dataSourceVersion": "1.0",
                  "type": "DataSource",
                  "title": null
                },
                "userFilterColumnId": null
              },
              "isIncomplete": false,
              "includeInExport": true,
              "excludeLabelInExport": false,
              "exportOnNewPage": false,
              "exportLabel": "",
              "exportIfEmpty": false,
              "isRequired": false,
              "isActive": null,
              "label": "Datensatz auswählen"
            }
          ],
          "isActive": null
        },
        {
          "brickId": "Section_2",
          "type": "Section",
          "includeInExport": true,
          "excludeLabelInExport": false,
          "exportOnNewPage": false,
          "exportIfEmpty": false,
          "exportLabel": "",
          "label": "Abschnitt",
          "bricks": [
            {
              "brickId": "Rating",
              "type": "Rating",
              "label": "Bewertung",
              "includeInExport": true,
              "excludeLabelInExport": false,
              "exportOnNewPage": false,
              "exportIfEmpty": false,
              "exportLabel": "",
              "isRequired": false,
              "isActive": {
                "trueAction": "Active",
                "falseAction": "Inactive",
                "formula": "EQUALS({DataRecordSelect[Box1]}, \"\")"
              },
              "description": "",
              "maxRatingCount": 5
            },
            {
              "brickId": "EmailCopy",
              "type": "CarbonCopy",
              "label": "Bericht als E-Mail senden",
              "description": "Senden Sie eine Kopie Ihrer aufgenommenen Daten per E-Mail an einen beliebigen Empfänger. Nach Absenden des Formulars wird diese an den eingegebenen Adressaten übermittelt.",
              "defaultSubject": "Bericht zu Ihren Daten",
              "defaultBody": "Guten Tag,\r\n\r\nanbei sende ich Ihnen einen Bericht der aufgenommenen Daten.\r\n\r\nMit freundlichen Grüßen",
              "isRequired": false,
              "isActive": null,
              "includeInExport": false,
              "excludeLabelInExport": false,
              "exportOnNewPage": false,
              "exportLabel": "",
              "exportIfEmpty": false
            },
            {
              "brickId": "SendReportMail",
              "type": "SendReportMail",
              "toEmailSource": {
                "formula": "\"test@example.com\""
              },
              "subjectSource": {
                "formula": "\"Bericht zu Ihren Daten\""
              },
              "bodySource": {
                "formula": "\"Guten Tag,\\n\\nanbei sende ich Ihnen einen Bericht der aufgenommenen Daten.\\n\\nMit freundlichen Grüßen\""
              },
              "isActive": null
            }
          ],
          "isActive": null
        }
      ],
      "label": "smap A"
    }
  ]
}

In fett markiert ist der Wert der gegen "XYZ" geändert werden soll.

Im nächsten Schritt (2 auf dem Screenshot) würde ich nun per PUT diesen Wert ändern wollen. Hierfür brauche ich folgende Parameter:
788590


Ich verstehe alle Parameter. Jedoch verstehe ich nicht was in die "definition" reinmuss. Nach meinem Verständnis hätte ich hier den Response-Body von oben mit dem editierten Wert eingefügt. Das klappt aber nicht (Error Code 400). Wenn ich auf das Model-Schema rechts neben dem defintion-Feld klicke, übernimmt das Feld das Schema. Doch auch so wird Error Code 400 (invalid request) zurück gegeben.

Hat jemand eine Lösung / Tipp?
 
Das was du dir im ersten SChritt geholt hast??

Ich weiß nicht, wie man das besser erklären kann als es da steht:

(Put) is used to modify any smap definition. A definition can be loaded using the get operation.

Evtl. ist die Version in der Put-URL einfach falsch? Normalerweise käme nie "Version: 0.0" zum Einsatz

Lg

PS: "Revision 0.0" ist eigentlich auch kein gültiger Integer.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: FreddyCollin
Das ist der springende Punkt was mich so verwirrt. Ich hätte den Response-Body aus dem GET 1zu1 (nach editierung des einzelnen Werts) als definition in der PUT Abfrage genommen... Das verursacht Fehler. Bei der Version meinst du den Wert für das "revision" feld?

Noch ne Frage im Anhang:
Man muss doch IMMER den kompletten Body in ein POST binden oder? Einen einzelnen wert alleine zu übergeben funktioniert doch nie bei einem POST befehl richtig?
 
Das hängt von der API ab. Wenn die das so implementiert hätten, könntest du auch (als Kurzform)

Code:
{
   "manifest": {
           "logo": {
                  "description": "Mein Logo"
            }
    }
}

schreiben, aber das lohnt sich nur in wenigen Fällen, z.B. wenn du sehr große Jsons hast und auch Anwendern mit sehr langsamer Verbindung ein schnelles Updaten ermöglichen willst oder häufig nur ein sehr kleiner Teil des Objekts geändert wird.

Das ist dann auch kein PUT mehr, sondern ein PATCH.

Stichwort: PATCH / "partial update", ...

Lg
 
  • Gefällt mir
Reaktionen: FreddyCollin
Mega Hilfe! Vielen dank!!
Kannst du mir erklären was "revision" bei einem PUT Request genau bedeutet? vielleicht komme ich so auf die Fehlerursache.
 
Ich gehe mal davon aus, dass wird wie bei GitHub u.Ä. Plattformen sein: Die Revision dient als Identifikator der Änderung, die Du gerade vorgenommen hast. Im Fall das deine Änderung fehlerhaft, kannst Du alles auf eine vorherige Version zurückspielen und kannst Dich dabei an der Revision orientieren.

Mit jeder Änderung steigt natürlich die Revisionsnummer bzw. ändert sich diese oder der Hash eben.
 
Zurück
Oben