Perl-使用Mojolicious :: Plugin :: OpenAPI和编码的URL

时间:2019-09-23 10:19:06

标签: perl swagger openapi mojolicious

我正在使用针对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感到非常沮丧,并且不确定如何处理。

我的问题是-

  1. 在后端处理这些类型的UR1的正确方法是什么。 我使用的模块正确吗?我的方法有问题吗?

  2. 我在打开的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。

0 个答案:

没有答案