Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Rest Json Fehler 415 unsopported Media Type (https://www.delphipraxis.net/209752-rest-json-fehler-415-unsopported-media-type.html)

josef-b 17. Jan 2022 14:37

Rest Json Fehler 415 unsopported Media Type
 
Hallo,

ich arbeite mich gerade ein wenig ein in Rest / Json.

Konkret geht es um den Datenaustausch zu einem Gambio Shop.

Ich kann problemlos mit TRestClient, TRestRequest, TRestResponse und THTTP BasichAuthenticator daten downloaden
(z.B. Produkte aus dem Webshop).

Wenn ich jetzt aber z.B. den Preis ändern möchte, kommt die Fehlermeldung:

415 unsupported Media Type

Mein Code:

Delphi-Quellcode:

Request.ResetToDefaults;
Request.Method := rmPUT;
Request.Resource := 'api.php/v2/product_prices/{product_id}';

Request.Addparameter( 'product_id','7' );
Request.Addparameter( 'price','10' );
Request.Execute;
Ist mit den Parametern das so OK?

ich habe was beim googeln gefunden evtl mit. zusätzlichen Parametern im header?

Bin auf dem Gebiet leider totaler newbie

Union 17. Jan 2022 14:58

AW: Rest Json Fehler 415 unsopported Media Type
 
Zunächst fehlt dir die Authorization und einen Body solltest Du auch mitschicken. Wenn es sich um eine Neuentwicklung handelt, solltest Du auch wohl besser die neueste API Version verwenden (V3 statt V2).

Die Definition wie der Request und insbesondere der Body auszusehen hat, steht hier

josef-b 17. Jan 2022 15:18

AW: Rest Json Fehler 415 unsopported Media Type
 
Danke für die schnelle Antwort.

Die Authentizierung klappt, habe ich in der Client-Komponente eingebenen mit Authenticator-Komponente verknüpft.

Ohne Authentifzierung käme 401 unauthorized.

Die Gambio - Dokumentation habe ich. Die übrigen Parameter muss ich doch nicht übergeben/belegen oder?

Es reicht doch die Produkt-ID und der Preis?

Was meinst du genau mit ich muß einen Body-übergeben?

Union 17. Jan 2022 15:35

AW: Rest Json Fehler 415 unsopported Media Type
 
415 kommt weil du einen ungültigen Query Parameter "price" übergibst. Die Preisdaten sollen aber im Body des Request stehen. Im o.a. Link siehst Du, wie dieses JSON auszusehen hat (gxproductprices-Struktur).

Uwe Raabe 17. Jan 2022 15:42

AW: Rest Json Fehler 415 unsopported Media Type
 
Die Product ID gehört ja in die URL. Das gibt man bei AddParameter an:
Delphi-Quellcode:

Request.Addparameter('product_id', '7', TRESTRequestParameterKind.pkURLSEGMENT);
Für den Body solltest du ein passendes Objekt als JSON übergeben:
Delphi-Quellcode:
type
  { unvollständige Klasse ohne richtigen Support für GroupPrices und GraduatedPrices. Erweiterung als Übung :) }
  TUpdateProductPrices = class
  type
    TGroupPrice = class
    type
      TGraduatedPrice = class
        FGraduatedPrice: Double;
        FThreshold: Double;
      end;
    private
      FCustomerGroupId: Integer;
      FGraduatedPrices: TArray<TGraduatedPrice>;
      FGroupPrice: Double;
    end;
  private
    FGroupPrices: TArray<TGroupPrice>;
    FPrice: Double;
  public
    property Price: Double read FPrice write FPrice;
  end;

...

  instance := TUpdateProductPrices.Create;
  try
    instance.Price := 10;
    Request.AddBody<TUpdateProductPrices>(instance); // hier wird das JSON intern zusammengebaut
  finally
    instance.Free;
  end;

josef-b 17. Jan 2022 16:57

AW: Rest Json Fehler 415 unsopported Media Type
 
Geht das mit addbody evtl. auch ohne Klassen zu erstellen?

Uwe Raabe 17. Jan 2022 17:42

AW: Rest Json Fehler 415 unsopported Media Type
 
Zitat:

Zitat von josef-b (Beitrag 1500762)
Geht das mit addbody evtl. auch ohne Klassen zu erstellen?

Ja, wenn du das JSON bzw. JSONObject selbst zusammenbaust.

josef-b 17. Jan 2022 19:12

AW: Rest Json Fehler 415 unsopported Media Type
 
Danke für Eure Tips, ich stand echt im Wald ;-)

Ich habs dann jetzt so gemacht:

Delphi-Quellcode:

procedure TFRest.BtnSetPreisClick(Sender: TObject);
var obj : TJsonObject;
objGroupPrices : TJsonArray;
begin

Req.ResetToDefaults;
Req.Method := rmPUT;
Req.Resource := 'api.php/v2/product_prices/{product_id}';
EditResource.editvalue := req.Resource;

Req.Addparameter('product_id', '7', TRESTRequestParameterKind.pkURLSEGMENT);

Obj := TJSONObject.Create;
ObjGroupPrices := TJSonArray.Create;

obj.AddPair('groupPrices',objGroupPrices);
obj.Addpair('price' ,TJsonNumber.create(10));

memo1.clear;
memo1.Lines.Add(obj.toJson);

req.addbody(obj);

objGroupPrices.free;

Req.Execute;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz