Curl命令无法上载特定Avro模式,而该模式在Postman中上载正常

q1qsirdb  于 2022-11-07  发布在  Postman
关注(0)|答案(2)|浏览(173)

在Pulsar中,我编写了一些简单的BASH脚本,使用curl命令创建主题并将其上传到我的名称空间:

function create_partioned_topic {
    echo -e "\n+++ Creating partioned topic: $TOPIC +++"
    curl --location --request PUT "https://$PULSAR_HOST:$HOST_PULSAR_PORT/admin/v2/persistent/$TENANT/$NAMESPACE/$TOPIC/partitions" \
        --verbose \
        --header "Authorization: Bearer $AUTHORIZATION"  \
        --insecure \
        --header 'Content-Type: application/json' \
        --data-raw '3' 2>&1 | cat | grep "HTTP" # grep -v "Authorization"
}

function uploading_topic {
    echo -e "\n\n+++ Uploading $TOPIC +++"
    curl --location --request POST "https://$PULSAR_HOST:$HOST_PULSAR_PORT/admin/v2/schemas/$TENANT/$NAMESPACE/$TOPIC/schema" \
        --verbose \
        --header "Authorization: Bearer $AUTHORIZATION"  \
        --insecure \
        --header 'Content-Type: application/json' \
        --data-raw $SCHEMA 2>&1 | cat | grep "HTTP" # grep -v "Authorization"
}

这些命令工作正常,除了以下我尝试上传:

TOPIC=nested_schema
NESTED_SCHEMA='{"schema":"{\"type\":\"record\",\"name\":\"DatasetEventSchema\",\"namespace\":\"channels.$TENANT.$NAMESPACE.$TOPIC.generated\",\"fields\":[{\"name\":\"DataRecord\",\"type\":{\"name\":\"DataRecordSchema\",\"type\":\"record\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"created_by\",\"type\":\"string\"},{\"name\":\"updated_by\",\"type\":\"string\"},{\"name\":\"created_at\",\"type\":\"string\"},{\"name\":\"updated_at\",\"type\":\"string\"},{\"name\":\"data_legitimacy\",\"type\":\"string\"},{\"name\":\"item_status\",\"type\":\"string\"},{\"name\":\"tenant_id\",\"type\":\"string\"},{\"name\":\"tags\",\"type\":\"string\"},{\"name\":\"dataset_series_id\",\"type\":\"string\"},{\"name\":\"location_id\",\"type\":\"string\"},{\"name\":\"provided_by\",\"type\":\"string\"},{\"name\":\"metadata\",\"type\":\"string\"}]}},{\"name\":\"MetadataRecord\",\"type\":{\"name\":\"MetadataRecordSchema\",\"type\":\"record\",\"fields\":[{\"name\":\"timestamp\",\"type\":\"string\"},{\"name\":\"record_type\",\"type\":\"string\"},{\"name\":\"operation\",\"type\":\"string\"},{\"name\":\"partition_key_type\",\"type\":\"string\"},{\"name\":\"schema_name\",\"type\":\"string\"},{\"name\":\"table_name\",\"type\":\"string\"},{\"name\":\"transaction_id\",\"type\":\"string\"}]}}]}","type":"AVRO","properties":{}}'

当我通过curl命令上传这个Schema时,它似乎永远不会完成。我收到它开始发布的通知,但它永远不会完成。
我上传的其他模式也能正常工作。

TOPIC=double_nested_schema
DOUBLE_NESTED_SCHEMA='{"schema":"{\"type\":\"record\",\"name\":\"DoubleNestedSchema\",\"namespace\":\"channels.$TENANT.$NAMESPACE.$TOPIC.generated\",\"fields\":[{\"name\":\"DataRecord\",\"type\":{\"name\":\"DataRecordSchema\",\"type\":\"record\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"IdRecord\",\"type\":{\"name\":\"IdRecordSchema\",\"type\":\"record\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"}]}}]}},{\"name\":\"MetadataRecord\",\"type\":{\"name\":\"MetadataRecordSchema\",\"type\":\"record\",\"fields\":[{\"name\":\"timestamp\",\"type\":\"string\"}]}}]}","type":"AVRO","properties":{}}'

TOPIC=simplest_schema
SIMPLEST_SCHEMA='{"schema":"{\"type\":\"record\",\"name\":\"SimplestExample\",\"namespace\":\"channels.$TENANT.$NAMESPACE.$TOPIC.generated\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"}]}","type":"AVRO","properties":{}}'

我尝试过的事情

  • 正如我在上面提到的,我已经尝试了两种不同的模式SIMPLEST_SCHEMADOUBLE_NESTED_SCHEMA,它们都运行良好
  • 我还测试了在Postman中运行相当于上传我的NESTED_SCHEMA的程序,它运行得很好。这是否表明curl中有什么地方不喜欢我的格式?
t9eec4r0

t9eec4r01#

FWIW,在修复了单引号之后,我尝试通过curl在这个site上发送这个有问题的模式,并将内容类型指定为application/jsonYou selected 'application/json' content type, but the provided string is not a valid JSON string.
基于此,您的JSON似乎是错误的。

kkbh8khc

kkbh8khc2#

我尝试了许多解决方案,但我一直发现这在Postman中工作得很好,但不是作为curl命令。
当我打开--verbose标题时,我看到我在大约这个点上被挂起了:

> Expect: 100-continue
> 

* Done waiting for 100-continue

显然,在以下情况下会发生此行为:

  • 请求是PUT或
  • 请求是POST,并且数据大小大于1024字节

通过将Except标头设置为空字符串,可以关闭此行为。
像这样:
curl -H '期望值:'
这个版本的curl命令最终对我有效:

curl --location --request POST "https://$PULSAR_HOST:$HOST_PULSAR_PORT/admin/v2/schemas/$TENANT/$NAMESPACE/$TOPIC/schema" \
        --verbose \
        --header 'Expect:' \
        --header "Authorization: Bearer $AUTHORIZATION"  \
        --insecure \
        --header "Content-Type: $content_type" \
        --data-raw $SCHEMA 2>&1 | grep "HTTP" # grep -v "Authorization"

参见参考文献:

相关问题