Golang使用atreugo接收带#的URL参数GET请求内容被截断怎么解决
问题根本原因
URL 中的 # 是HTTP规范定义的片段标识符标识,所有标准HTTP客户端发起请求时,都会自动丢弃#及之后的所有内容,不会将这部分内容发送到服务端。你遇到的参数截断问题和你使用的atreugo、fasthttp框架无关,框架本身没有问题,也无法通过修改框架配置拿到本就没有被发送到服务端的内容。
解决方案
方案1(最优解):要求Shopify侧对参数做URL编码
要求Shopify在发送请求时,对order_names的参数值进行URL编码,将#转义为%23。转义后#不再作为片段标识符的标识,会作为普通参数值的一部分被发送到服务端,你服务端收到参数后做一次URL解码即可拿到完整的带#的订单名称。
示例编码后的请求如下:
GET http://localhost:4200/v1/fetch_tracking_numbers.json?order_names[]=%231001.1&order_names[]=%231002.1&order_names[]=%231003.2
你可以在Shopify的履约应用回调配置中开启参数自动编码,如找不到对应配置可联系Shopify官方支持调整。
方案2:修改接口为POST请求传递参数
将你的回调接口调整为接收POST请求,把order_names等参数放在请求体(JSON格式/表单格式均可)中传递,不要放在URL查询字符串里。这种场景下#只是普通字符串,不会被HTTP客户端截断,你直接从请求体中读取参数即可拿到完整值。
你只需要同步在Shopify应用配置中将回调请求方式修改为POST,配置参数走请求体传递即可,整体改造成本很低。
内容的提问来源于stack exchange,提问作者Brady Agranoff
相关产品推荐
相关产品推荐

