如何在 .Net Core API 中传递查询字符串中的特殊字符?

4

这是一个关于Net Core应用的内容。我有一个如下所示的GET API:

        [HttpGet]
        [Route("configId={configId}&quoteId={quoteId}"), EnableQuery()]
        public async Task<IEnumerable<Scenario>> GetScenario(string configId, int quoteId)
        {
            var result = await configScenarioService.GetScenarioAsync(configId, quoteId);
            if (result.IsSuccess)
            {
                return result.scenarioResults;
            }
            return new List<Scenario>();
        }

我正在尝试使用Postman进行如下操作:

https://localhost:44362/api/v1/Scenario/configId=JBEL+ASS_60_SG_5.2-145_MY21_T102.5_25y&quoteId=236

很不幸,这会导致 404 错误。也许是加号符号引起了问题。查阅了一些文档后,我尝试了以下操作:

1. https://localhost:44362/api/v1/Scenario/configId="+ encodeURIComponent(BEL+ASS_60_SG_5.2-145_MY21_T102.5_25y) +"&quoteId=236

这对我没有用,仍然会显示404错误。

如何解决这个问题?

4个回答

2

由于您的URL中包含加号,因此需要对其进行编码。对于加号,URL编码为%2B。详见https://www.w3schools.com/tags/ref_urlencode.asp

..../Scenario?configId=JBEL%2BASS_60_SG_5.2-145_MY21_T102.5_25y&quoteId=236

由于您遇到了404错误,您需要修复一个操作路由。

[Route("~/api/v1/Scenario")]
 public async Task<IEnumerable<Scenario>> GetScenario([FromQuery] string configId, [FromQuery] int quoteId)

是的,这个在Swagger上可以工作,但我的JS代码文件中有以下代码const urlEncode = encodeURIComponent(configurationId) doGet(Scenario/GetScenario/configId=${urlEncode}&quoteId=${quote}。当我在网络选项卡中查看时,它会转换为configId=JBEL%2BASS_60_SG_5.2-145_MY21_T102.5_25y,但是当我尝试从Swagger中获取时,它会转换为configId=JBEL%252BASS_60_SG_5.2-145_MY21_T102.5_25y,所以%2和%252之间存在差异。 - Mr Perfect
@MrPerfect,请注意应该使用%2B,详见我的更新回答。如果编码有问题,您可以尝试使用string.replace("+", "%2B")。 - Serge

2
那么尝试这个吧:
[ApiController]
[Route("api/v1/[controller]/[action]")]
public class YourController : ControllerBase
{
    //... ctor and your other stuff

    [HttpGet("{configId}/{quoteId}", Name = "Scenario")]
    [ProducesResponseType(typeof(IEnumerable<Scenario>)]
    public async Task<ActionResult<IEnumerable<Scenario>>> GetScenario(string configId, string quoteId)
    {
        
    }
}

1

试试这个

[HttpGet]
        [Route, EnableQuery()]
        public async Task<IEnumerable<Scenario>> GetScenario([FromQuery(Name = "configId")]string configId, [FromQuery(Name = "quoteId")]int quoteId)
        {

感谢您的回答。我尝试添加了上述代码 [HttpGet] [Route("GetScenario"), EnableQuery()] public async Task<IEnumerable<Scenario>> GetScenario([FromQuery(Name = "configId")] string configId, [FromQuery(Name = "quoteId")] int quoteId),但对我没有起作用。 - Mr Perfect
从JavaScript方面来看,我也尝试过,但对我来说没有效果。const urlEncode = encodeURIComponent(configurationId) doGet(Scenario/configId=${urlEncode}&quoteId=${quote} - Mr Perfect

-1

有效的方法是 const urlEncode = encodeURIComponent(encodeURIComponent(configId)) 但我仍然不明白为什么我应该在我的js中使用encodeURIComponent(encodeURIComponent)


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