How to pass special character in query string in .Net core API?

Viewed 366

Net core application. I have one GET api as below:

        [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>();
        }

I am trying to hit from Postman as below:

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

Unfortunately, this is giving 404 error. Maybe the '+' sign is causing the issue. After looking into some documentation, I tried as below:

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

This didn't work for me and still gave a 404 error.

How can this be fixed?

4 Answers

Try this

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

since you have + sign you have to encode your url, for + url encoded is %2B https://www.w3schools.com/tags/ref_urlencode.asp

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

and since you have 404 you have to fix an action route too

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

Then try this:

[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)
    {
        
    }
}

what worked is const urlEncode = encodeURIComponent(encodeURIComponent(configId)) but still i am unable to figure it why i should use encodeURIComponent(encodeURIComponent) in my js

Related