asyncapi / spec

The AsyncAPI specification allows you to create machine-readable definitions of your asynchronous APIs.
https://www.asyncapi.com
Apache License 2.0
3.99k stars 261 forks source link

Allow plain `string` in Message Example Object field payload for non-json payloads (like xml, yaml) #1038

Open timonback opened 4 months ago

timonback commented 4 months ago

Describe the bug

Hi, we are implementing the spec to create a Message Example Object for xml. The field payload assumes a Map[string, any], which only works for json.

How is i.e. an xml payload represented?

payload Map[string, any] The value of this field MUST validate against the Message Object's payload field.

To Reproduce

See sample document

Expected behavior

We assume that a plain string (or any) should also be allowed.

Sample document

{
  "name": "SimpleSignup",
  "summary": "A simple UserSignup example message",
  "headers": {
    "correlationId": "my-correlation-id",
    "applicationInstanceId": "myInstanceId"
  },
  "payload": "<xml><with_field>value</with_files></xml>"
}
github-actions[bot] commented 4 months ago

Welcome to AsyncAPI. Thanks a lot for reporting your first issue. Please check out our contributors guide and the instructions about a basic recommended setup useful for opening a pull request.
Keep in mind there are also other channels you can use to interact with AsyncAPI community. For more details check out this issue.

GreenRover commented 4 months ago

Please have a look at the multi format schema object: https://www.asyncapi.com/docs/reference/specification/v3.0.0#multiFormatSchemaObject

This makes your api a little bit more valid. But xml is still no valid and official supported schema type. There are a lot of discussion why not. But in short, xml knows attributes and childs. This can not be handled by tooling.

timonback commented 4 months ago

Thank you @GreenRover for the reference link. Specifying a complete schema for xml is probably a bit overkill for us, but we will discuss. (Based on a java class, we only want to generate an xml example)

But in short, xml knows attributes and childs

So true, we came across the same issue with the xml attributes.


I tested a bit more, and changing the SchemaObjects field type value to string (instead of object) does the trick so that AsyncApi Studio does validate (through asyncapi/parser) positively.

"io.github.springwolf.examples.kafka.dtos.XmlPayloadDto": {
  "type": "string",
  "properties": {
    "someEnum": {
      "type": "string",
      "enum": [
        "FOO1",
        "FOO2",
        "FOO3"
      ]
    },
    "someLong": {
      "type": "integer",
      "format": "int64"
    },
    "someString": {
      "type": "string"
    }
  },
  "examples": [
    "<io.github.springwolf.examples.kafka.dtos.XmlPayloadDto><someEnum>FOO1</someEnum><someLong>0</someLong><someString>string</someString></io.github.springwolf.examples.kafka.dtos.XmlPayloadDto>"
  ]
}
GreenRover commented 4 months ago

Can you please provide the full schema. Because what you provide looks more like a bug in studio.

timonback commented 4 months ago

Sure, here it is:

{
  "asyncapi": "3.0.0",
  "info": {
    "title": "Springwolf example project - Kafka",
    "version": "1.0.0",
    "description": "Springwolf example project to demonstrate springwolfs abilities, including **markdown** support for descriptions.",
    "contact": {
      "name": "springwolf",
      "url": "https://github.com/springwolf/springwolf-core",
      "email": "example@example.com"
    },
    "license": {
      "name": "Apache License 2.0"
    },
    "x-generator": "springwolf"
  },
  "defaultContentType": "application/json",
  "servers": {
    "kafka": {
      "host": "kafka:29092",
      "protocol": "kafka"
    }
  },
  "channels": {
    "xml-topic": {
      "messages": {
        "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto": {
          "$ref": "#/components/messages/io.github.springwolf.examples.kafka.dtos.XmlPayloadDto"
        }
      }
    }
  },
  "components": {
    "schemas": {
      "HeadersNotDocumented": {
        "type": "object",
        "properties": { },
        "examples": [
          { }
        ],
        "x-json-schema": {
          "$schema": "https://json-schema.org/draft-04/schema#",
          "type": "object"
        }
      },
      "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto": {
        "type": "object",
        "properties": {
          "someEnum": {
            "type": "string",
            "enum": [
              "FOO1",
              "FOO2",
              "FOO3"
            ]
          },
          "someLong": {
            "type": "integer",
            "format": "int64"
          },
          "someString": {
            "type": "string"
          }
        },
        "examples": [
          "<io.github.springwolf.examples.kafka.dtos.XmlPayloadDto><someEnum>FOO1</someEnum><someLong>0</someLong><someString>string</someString></io.github.springwolf.examples.kafka.dtos.XmlPayloadDto>"
        ],
        "x-json-schema": {
          "$schema": "https://json-schema.org/draft-04/schema#",
          "properties": {
            "someEnum": {
              "enum": [
                "FOO1",
                "FOO2",
                "FOO3"
              ],
              "type": "string"
            },
            "someLong": {
              "format": "int64",
              "type": "integer"
            },
            "someString": {
              "type": "string"
            }
          },
          "type": "object"
        }
      }
    },
    "messages": {
      "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto": {
        "headers": {
          "$ref": "#/components/schemas/HeadersNotDocumented"
        },
        "payload": {
          "schemaFormat": "application/vnd.aai.asyncapi+json;version=3.0.0",
          "schema": {
            "$ref": "#/components/schemas/io.github.springwolf.examples.kafka.dtos.XmlPayloadDto"
          }
        },
        "contentType": "text/xml",
        "name": "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto",
        "title": "XmlPayloadDto",
        "bindings": {
          "kafka": {
            "bindingVersion": "0.4.0"
          }
        }
      }
    }
  },
  "operations": {
    "xml-topic_receive_receiveExamplePayload": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/xml-topic"
      },
      "title": "xml-topic_receive",
      "description": "Showcases a xml based message",
      "bindings": {
        "kafka": {
          "bindingVersion": "0.4.0"
        }
      },
      "messages": [
        {
          "$ref": "#/channels/xml-topic/messages/io.github.springwolf.examples.kafka.dtos.XmlPayloadDto"
        }
      ]
    }
  }
}
timonback commented 1 month ago

Any update on this? Should I duplicate the issue in studio?

timonback commented 1 week ago

Update: the related PR has been merged in parser-js: https://github.com/asyncapi/parser-js/pull/1007 EDIT: actually, it was only updated, not merged yet