所以我建立了一个调用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? 有人知道解决方案吗?谢谢
答案 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/123
,id
被分配了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。