我正在使用针对Mojolicious应用程序的Mojolicious :: Plugin :: OpenAPI使用OpenAPI(swagger)v2规范创建静态API。
我必须创建一个GET端点,其中将URL作为查询参数传递。 这个特定的URL是可以被编码(甚至是punnycoded)的随机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": {}
}
}
}
}
}
}
在我的Controller类中,我检查了有效的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' }
}
);
}
}
我在数据库中以百分比编码形式(%)拥有这些网址。在api请求中,我将获得随机编码形式的网址(中文编码,punnycoded等)。我必须将这些url编码为百分比编码并查看DB。 我已经尝试通过URL :: Encode来做到这一点,但是我并不是100%正确地对百分比编码进行编码(它们都将'+'转换为我不想要的百分比编码)。最近几天我对这些编码的URL感到非常沮丧,并且不确定如何处理。
我的问题是-
在后端处理这些类型的UR1的正确方法是什么。 我使用的模块正确吗?我的方法有问题吗?
我在打开的api文档(https://swagger.io/docs/specification/describing-parameters/)中发现了'allowReserved'参数,我认为该参数可用于处理此类url,但是当我使用它时,我的OpenAPI Specification json并更新了参数部分,如-< / p>
"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我在请求期间进入后端- 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“
数据库中的网址- 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 +%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和DB应该匹配。理想情况下,我应该使用与数据库中相同的URL。