Я нахожусь в процессе создания успокоительных API, используя спецификацию OpenAPI (swagger) v2, используя Mojolicious :: Plugin :: OpenAPI для моего приложения Mojolicious.
Мне нужно создать конечную точку GET, где URL будетбыть передан в качестве параметра запроса.Этот конкретный URL является случайным URL, который может быть закодирован (даже без кода).Иногда он также содержит специальный символ (например, http://example.com/4v3iI6HO/لعب+-+Ù).
Моя спецификация OpenAPI json - -
{
"swagger": "2.0",
"info": {
"version": "1.0",
"title": "MyApp API"
},
"schemes": ["https"],
"basePath": "/api",
"host": "myapp.com",
"paths": {
"/uri_lookup": {
"get": {
"x-mojo-name": "get_urls_details",
"x-mojo-to": "API::Urls#get_urls_details",
"operationId": "get_urls_details",
"parameters": [
{
"in": "query",
"name": "url",
"required": true,
"type": "string",
"description": "Url to search"
}
],
"responses": {
"200": {
"description": "Url Details",
"schema": {
"type": "object"
}
},
"default": {
"description": "Unexpected error",
"schema": {}
}
}
}
}
}
}
И в моем классе контроллера I проверка действительного URL, запрос к БД и возвратответ.
sub get_urls_details {
my ($self) = @_;
$self->openapi->valid_input or return;
# Checking it avalid url (starting with http/https or ftp)
$self->_validate_url( $self->param("url") );
if ( not $self->validation->validator->has_error ) {
my $input = $self->validation->validator->output;
my $url = $input->{'url'};
# Till here everything is working fine for a normal url.
# But if a url contain special character,
# I am not able to see proper value here
my $uri_encoder = URI::Encode->new( { double_encode => 1, encode_reserved => 0 } );
$url = $uri_encoder->encode($url);
$self->app->log->info($url);
# Will be looking into DB here
}
else {
$self->respond_to(
any => {
status => 400,
json => { message => 'Bad request. Invalid url' }
}
);
}
}
У меня есть эти URL в БД в процентной кодировке (%). В запросе API я получу URL в случайной кодировке (китайская кодировка, punnycoded и т. д.). Я должензакодировать эти URL в там процентное кодирование и заглянуть в БД. Я пытался сделать это через URL :: Encode, но я не получаю 100% правильное процентное кодирование (все это конвертирует '+' в процентное кодирование, которое я не хочу)Я за последние пару дней очень расстроен этим закодированным URL, и я не уверен, как справиться с этим.
Мой вопрос -
Что такоеправильный способ передачи этих типов URl на стороне сервера. Является ли используемый мной модуль правильным? Что-то не так с моим подходом?
Я нашел 'allowReserved' parameter в open api doc (https://swagger.io/docs/specification/describing-parameters/), который, я думаю, можно использовать для обработки таких URL-адресов, но когда я использовал его, моя спецификация OpenAPI json и обновила раздел параметров, например-
"parameters": [
{
"in": "query",
"name": "url",
"required": true,
"type": "string",
"description": "Url to search",
"allowReserved": true
}
],
Я начал получать ошибки -
Can't load application from file "/home/Developmentmyapp": Invalid JSON specification HASH(0x41e3fe0):
- /paths/~1uri_lookup/get/parameters/0: /oneOf/0/oneOf/0 Properties not allowed: allowReserved, type.
- /paths/~1uri_lookup/get/parameters/0: /oneOf/0/oneOf/1/oneOf/0 Properties not allowed: allowReserved.
- /paths/~1uri_lookup/get/parameters/0: /oneOf/0/oneOf/1/oneOf/1 Properties not allowed: allowReserved.
- /paths/~1uri_lookup/get/parameters/0: /oneOf/0/oneOf/1/oneOf/2 Properties not allowed: allowReserved.
- /paths/~1uri_lookup/get/parameters/0: /oneOf/0/oneOf/1/oneOf/3 Properties not allowed: allowReserved.
- /paths/~1uri_lookup/get/parameters/0: /oneOf/1 Properties not allowed: allowReserved, description, in, name, required, type. at /usr/local/share/perl/5.22.1/JSON/Validator.pm line 164.
JSON::Validator::load_and_validate_schema(JSON::Validator::OpenAPI::Mojolicious=HASH(0x3eee5b8), Mojo::Home=SCALAR(0x3e7b200), HASH(0x41ea790)) called at /usr/local/share/perl/5.22.1/JSON/Validator/OpenAPI/Mojolicious.pm line 39
Я не уверен, почему эта ошибка появляется.Этот конкретный параметр не поддерживается в плагине?
Версия, которую я использую -
Perl - 5.22
Mojolicious- 8.24
JSON :: Validator -3.14
Mojolicious :: Plugin :: OpenAPI - 2.16
API-запрос - http://localhost:3000/api/uri_lookup?url=hxxp://tets.com/xeroxep3290_all/TtQoy_B0/4v3iI6HO/لعبة+الامم+-+مايلز+كوبلاند.exe
URL, который я получаю в бэкэнде во времяrequest- hxxp: //test.com/xeroxep3290_all/TtQoy_B0/4v3iI6HO/%C3%99%E2%80%9E%C3%98%C2%B9%C3%98%C2%A8%C3%98%C2% A9% 20% C3% 98% C2% A7% C3% 99% E2% 80% 9E% C3% 98% C2% A7% C3% 99% E2% 80% A6% C3% 99% E2% 80%A6% 20-% 20% C3% 99% E2% 80% A6% C3% 98% C2% A7% C3% 99% C5% A0% C3% 99% E2% 80% 9E% C3% 98% C2% B2% 20% C3% 99% C6% 92% C3% 99% CB% 86% C3% 98% C2% A8% C3% 99% E2% 80% 9E% C3% 98% C2% A7% C3% 99% E2% 80% A0% C3% 98% C2% AF.exe "
URL в БД - hxxp: //test.com/xeroxep3290_all/TtQoy_B0/4v3iI6HO/%C3%99%E2% 80% 9E% C3% 98% C2% B9% C3% 98% C2% A8% C3% 98% C2% А9 +% C3% 98% C2% A7% C3% 99% E2% 80% 9E% C3%98% C2% A7% C3% 99% E2% 80% A6% C3% 99% E2% 80% A6 + - +% C3% 99% E2% 80% A6% C3% 98% C2% A7% C3% 99%C5% A0% C3% 99% E2% 80% 9E% C3% 98% C2% B2 +% C3% 99% C6% 92% C3% 99% CB% 86% C3% 98% C2% A8% C3% 99% E2% 80% 9E% C3% 98% C2% A7% C3% 99% E2% 80% A0% C3% 98% C2% AF.exe
Я ожидаю URL в конце иБД должна совпадать.В идеале у меня должен быть тот же URL, что и в базе данных.