Restful API编码/解码十六进制问题

4

我使用Flask在本地服务器上创建了一个Restful API。
我遇到了一些十六进制编码/解码方面的问题。

我创建了一个用于调试问题的函数,代码如下:

class test_encoding(Resource) :
    def get(self,val):
        return{'data': val}

api.add_resource(test_encoding,'/testencoding/<val>')

例如,如果我在Chrome中使用以下请求:
.../testencoding/%23

我收到了这个响应(十六进制编码):
{"data": "#"}

但我希望保留Chrome中输入的字符串,包括%符号:

{"data": "%23"}

我知道我需要处理编码和解码,但是我很迷茫。你可以帮助我吗?

在此先感谢您的帮助,
LCMa

更新

当我尝试通过request.url获取URL时,它返回相同的“#”而不是“%23”,我明白了URL被自动修改了。 我的想法是重新获取显示在提示中的请求URL:

(base) C:\Users\maell\PycharmProjects\Serveur>python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [13/Mar/2019 10:02:53] "GET /testencoding/%23 HTTP/1.1" 200 -

我们可以看到,这里的URL是以我想要的方式打印出来的。
但是如何从控制台获取这个URL?这可能吗?

遇到了同样的问题,我所做的是将您需要的任何数据放入请求正文中,而不是URL中。如果有一种方法可以在URL中实现它,我也很想学习。 - RnD
你尝试过对URL进行编码吗?例如:".../testencoding/%2523"。 - CryptoFool
我尝试在我的get函数中添加val.replace('%','%25'),但它不起作用,因为我认为val已经变成了'#'(如果输入是%23)。所以我真的不知道在哪里进行URL编码... - LCMa
@研发团队:这是针对GET请求吗?因为通常情况下,GET请求不会有请求体。 - LCMa
@LCMa,你可以将它放在GET中,但这是不好的做法。从你的示例来看,它应该是一个POSTPUT,我会发一个例子。 - RnD
1个回答

1
这是一个示例,演示如何使用两种方式。我从URL中接收项目ID,因为它只是一个数字,但名称包含特殊字符,这些字符已从URL中删除,因此唯一的方法是将其放入请求正文中。
@projects.route("/<project_id>/configurations/<configuration_id>/rename", methods=['PUT'])
    new_name = json.loads(request.data)['name']

非常感谢!它对我想做的事情很有效! - LCMa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接