Inhalte aufrufen

Profilbild
- - - - -

Erweitern der WebApi in eigenem Plugin

erweiterung webapi

  • Bitte melden Sie sich an, um eine Antwort zu verfassen.
4 Antworten zu diesem Thema

#1 Algorithman

Algorithman

    Advanced Member

  • Members
  • PunktPunktPunkt
  • 39 Beiträge

Geschrieben: 30 December 2022 - 09:37

Guten Morgen,

 

1. Ist es möglich, die WebApi im eigenen Plugin zu erweitern oder muss ich dazu das WebApi-Plugin ändern?

2. Hab's jetzt nicht im Source gefunden, aber gibt es die WebApi auch als json? (um sich über die OA tools einen client automatisch zu erstellen)


  • Lighthouse gefällt das

#2 Algorithman

Algorithman

    Advanced Member

  • Members
  • PunktPunktPunkt
  • 39 Beiträge

Geschrieben: 30 December 2022 - 09:55

1. Frage hat sich erledigt, hab den kleinen Link im Swagger nicht gesehen :)

Für die, die es auch suchen: <host>/docs/api/webapi1/swagger.json

 

2. Frage auch erledigt,man muss sich nur seinen WebApiController<NeuerDatenTyp> erstellen, der wird dann automatisch eingebunden. Der Domain-Typ wird dann automatisch in die swaggerUI/swagger.json eingebunden. Nachteil, neue WebApiController werden in der UI/json (noch) nicht angezeigt.



#3 Algorithman

Algorithman

    Advanced Member

  • Members
  • PunktPunktPunkt
  • 39 Beiträge

Geschrieben: 30 December 2022 - 11:21

Ok, jetzt brauch ich doch noch ein paar Infos.

 

Ich hab mein Domain und Model für meine zusätzlichen Produktinfos erstellt. Soweit so gut, werden auch in der swagger.json abgebildet.

Dann hab ich mir noch einen WebApiController<AdditionalProductData> angelegt, in der Hoffnung, dass das dann auch im swagger auftaucht.

    [ODataRouteComponent("odata/v1")]
    [Route("odata/v1")]
    [ApiExplorerSettings(GroupName = "webapi1")]
    public class AdditionalProductDatasController : WebApiController<AdditionalProductData>
    {
        [HttpGet, ApiQueryable]
        [Permission(Permissions.Customer.Read)]
        public IQueryable<AdditionalProductData> Get()
        {
            return Entities.AsNoTracking();
        }


        [HttpGet, ApiQueryable]
        [Permission(Permissions.Customer.Read)]
        public SingleResult<AdditionalProductData> Get(int key)
        {
            return GetById(key);
        }

        [HttpPost]
        [Permission(Permissions.Customer.Create)]
        public Task<IActionResult> Post([FromBody] AdditionalProductData data)
        {
            return PostAsync(data);
        }

        [HttpPut]
        [Permission(Permissions.Customer.Update)]
        public Task<IActionResult> Put(int key, Delta<AdditionalProductData> model)
        {
            return PutAsync(key, model);
        }

        [HttpPatch]
        [Permission(Permissions.Customer.Update)]
        public Task<IActionResult> Patch(int key, Delta<AdditionalProductData> model)
        {
            return PatchAsync(key, model);
        }


        [HttpDelete]
        [Permission(Permissions.Customer.Delete)]
        public Task<IActionResult> Delete(int key)
        {
            return DeleteAsync(key);
        }
    }

Leider kein Erfolg. Muss ich den Controller unbedingt im WebApi Modul anlegen?

Ich würde gerne darauf verzichten, Änderungen in anderen Plugins vorzunehmen.



#4 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3831 Beiträge

Geschrieben: 30 December 2022 - 12:02

"Muss ich den Controller unbedingt im WebApi Modul anlegen?"
Nein.
 
Wie äußert sich "kein Erfolg"? Gibt es einen Fehler?
 
Die Attribute ODataRouteComponent, Route und ApiExplorerSettings bei AdditionalProductDatasController bitte alle entfernen. Das macht WebApiController bereits. Die Methoden "Get" benötigen Route-Templates "AdditionalProductDatas" bzw. "AdditionalProductDatas({key})". AdditionalProductData muss von BaseEntity erben. Das Modul benötigt eine IODataModelProvider Implementierung. Code-Schnipsel:
 
internal class MyModuleODataModelProvider : ODataModelProviderBase
{
  public override void Build(ODataModelBuilder builder, int version)
  {
    builder.EntitySet<AdditionalProductData>("AdditionalProductDatas");
  }
 
  public override Stream GetXmlCommentsStream(IApplicationContext appContext)
    => GetModuleXmlCommentsStream(appContext, "MyModule.Systemname");
}

 


  • Algorithman gefällt das

Marcus Gesing

Smartstore AG


#5 Algorithman

Algorithman

    Advanced Member

  • Members
  • PunktPunktPunkt
  • 39 Beiträge

Geschrieben: 30 December 2022 - 12:43

Danke für die schnelle Antwort.

 

Kein Erfolg: wird nicht im swagger ui angezeigt.

 

Die Attribute ODataRouteComponent, Route und ApiExplorerSettings bei AdditionalProductDatasController bitte alle entfernen.

 

Die hab ich nur Testweise eingefügt. Ging nicht mit oder ohne.
 

Die Methoden "Get" benötigen Route-Templates "AdditionalProductDatas" bzw. "AdditionalProductDatas({key})". 

 

Damit ist das template Argument bei den HttpGet Attributen gemeint? (Ja)

 

AdditionalProductData muss von BaseEntity erben.

 

 

Check.

 

[Table(nameof(AdditionalProductData))]
    [Index(nameof(ProductId), Name = $"IX_{nameof(AdditionalProductData)}_{nameof(ProductId)}")]
    public class AdditionalProductData : EntityWithAttributes, ICloneable, IEquatable<AdditionalProductData>

Der ODataModelProvider hats gefixt, vielen Dank :)




Auch markiert mit einem oder mehrerer dieser Schlüsselwörter: erweiterung, webapi