使用斜线参数“ /”调用Api

时间:2018-08-07 10:12:30

标签: typescript asp.net-core asp.net-core-webapi

所以我建立了一个调用GET请求的服务 这是我的称呼方式

async getAssetDetail(id: string) {
    let response = await Axios.get('/api/v1/asset/'+ id);
    this.assetDetail = response.data;
}

问题是,我的参数id的值类似2000/ABC/123 因此,路由将变为/api/v1/asset/2000/ABC/123,从而导致错误404

我已经尝试过使用字符串替换,但是不知何故它只能替换第一个斜杠

我的API是基于C#构建的

[HttpGet("{id}")]
    public async Task<AssetDetailModel> GetAsset(string id)
    {
        var asset = await this.assetService.GetAssetDetail(id);
        return asset;
    }

我还尝试将我的api网址硬编码为2000%2FABC%2F123,但仍然收到相同的错误

如何将我的参数从打字稿中的服务传递给C#中的api? 有人知道解决方案吗?谢谢

2 个答案:

答案 0 :(得分:2)

由于id中的斜线,需要使用 catch-all 路由参数来捕获路由模板之后的所有内容。

[Route("api/v1/[controller]")]
public class AssetController: Controller {

    //GET /api/v1/asset/2000/ABC/123
    [HttpGet("{*id}")]
    public async Task<AssetDetailModel> GetAsset(string id) {
        var asset = await this.assetService.GetAssetDetail(id);
        return asset;
    }

}

在上面的示例中,对于请求/api/v1/asset/2000/ABC/123id被分配了2000/ABC/123

但是,请注意,如果请求中包含查询字符串值,它也会采用任何形式。

/api/v1/asset/2000/ABC/123?param1=value1

将导致分配id

2000/ABC/123?param1=value1

这意味着在使用该参数之前,应先在操作中对其进行验证。

例如

[HttpGet("{*id}")]
public async Task<ActionResult<AssetDetailModel>> GetAsset(string id) {
    if(id == null || (id != null && id.IndexOf("?") > -1))
        return BadRequest();

    var asset = await this.assetService.GetAssetDetail(id);
    return asset;
}

答案 1 :(得分:0)

您需要将斜杠转为%2F。