asyncapi / spec

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

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

Open timonback opened 9 months ago

timonback commented 9 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 9 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 8 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 8 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 8 months ago

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

timonback commented 8 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 6 months ago

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

timonback commented 5 months 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

github-actions[bot] commented 1 month ago

This issue has been automatically marked as stale because it has not had recent activity :sleeping:

It will be closed in 120 days if no further activity occurs. To unstale this issue, add a comment with a detailed explanation.

There can be many reasons why some specific issue has no activity. The most probable cause is lack of time, not lack of interest. AsyncAPI Initiative is a Linux Foundation project not owned by a single for-profit company. It is a community-driven initiative ruled under open governance model.

Let us figure out together how to push this issue forward. Connect with us through one of many communication channels we established here.

Thank you for your patience :heart: