You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NestJS中从GET请求查询参数获取完整目标URL?

在NestJS中获取完整的目标URL查询参数

问题原因

你遇到的核心问题是:客户端请求中的&被HTTP解析器当成了整个请求的参数分隔符,而非目标URL的一部分。所以后端会把pn、mc等字段从目标URL中拆分出来,变成独立的查询参数。

最优解决方案(推荐)

1. 客户端对目标URL做URL编码

这是符合HTTP规范的标准做法,从根源上避免歧义。客户端需要将目标URL的值用encodeURIComponent()编码,把特殊字符(如&、?)转义为URL安全格式。

前端示例(JavaScript):

const targetUrl = 'new://way?si=asdas@direction&pn=(null)&mc=7&tr=HD&tp=Pay&am=17&mam=17&cu=INR';
const encodedUrl = encodeURIComponent(targetUrl);
// 拼接后的请求URL
const requestUrl = `http://127.0.0.1:4000/seni/abc/new-url?url=${encodedUrl}`;

编码后的请求URL会变成:

http://127.0.0.1:4000/seni/abc/new-url?url=new%3A%2F%2Fway%3Fsi%3Dasdas%40direction%26pn%3D(null)%26mc%3D7%26tr%3DHD%26tp%3DPay%26am%3D17%26mam%3D17%26cu%3DINR

后端处理:

此时直接用@Query('url')就能拿到完整的目标URL,NestJS会自动帮你解码:

@Controller('seni/abc')
export class AppController {
  @Get('new-url')
  getNewUrl(@Query('url') fullTargetUrl: string) {
    // fullTargetUrl 就是完整的目标URL:new://way?si=asdas@direction&pn=(null)&mc=7&tr=HD&tp=Pay&am=17&mam=17&cu=INR
    return { fullTargetUrl };
  }
}

备选方案(客户端无法修改时)

如果客户端无法调整请求格式,只能通过自定义装饰器提取原始查询字符串中的目标URL部分。

自定义装饰器实现

创建一个装饰器,直接从请求的原始查询字符串中截取url=之后的所有内容:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const FullUrlQuery = createParamDecorator(
  (paramName: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const queryString = request.querystring;
    if (!queryString) return null;

    const paramPrefix = `${paramName}=`;
    const paramStartIndex = queryString.indexOf(paramPrefix);
    if (paramStartIndex === -1) return null;

    // 截取参数名之后的所有内容,并解码
    const fullParamValue = queryString.slice(paramStartIndex + paramPrefix.length);
    return decodeURIComponent(fullParamValue);
  },
);

控制器中使用

import { Controller, Get } from '@nestjs/common';
import { FullUrlQuery } from './full-url-query.decorator';

@Controller('seni/abc')
export class AppController {
  @Get('new-url')
  getNewUrl(@FullUrlQuery('url') fullTargetUrl: string) {
    return { fullTargetUrl };
  }
}

注意事项

这种方式依赖查询参数的顺序:如果url参数后面还有属于整个请求的独立参数(而非目标URL的一部分),会被错误地包含进去。因此仅在客户端无法修改请求时使用。

内容的提问来源于stack exchange,提问作者VPR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:42:08