gpt4 book ai didi

azure-api-management - 在 Azure API 管理器中验证 POST 请求正文

转载 作者:行者123 更新时间:2023-12-03 19:36:46 25 4
gpt4 key购买 nike

我正在尝试在 Azure API 管理器中的 API 上设置入站策略,该策略在将 JSON 传递到后端之前验证 POST 请求正文中的 JSON。

我应该使用 JSON 模式并对此进行验证(如何?)还是应该编写自己的代码,使用 context.Request.Body 检查请求正文中的每个字段,还是尝试验证请求是完全错误的APIM 中的主体,应该留给后端吗?

最佳答案

我们目前正在使用 <set-body> 验证 API 操作策略。验证(并在需要时重新塑造 body )。在此策略中,我们收集所有错误,然后抛出异常:

    <set-body>@{ 
var body = context.Request.Body.As<JObject>(true);

string businessSystemID = context.Request.Headers.GetValueOrDefault("SenderBusinessSystemID", "");

var result = new JObject();

string cleanUp = body.ToString().Replace("\r\n","");
var root = JObject.Parse(cleanUp);

var valid = false;
var errors = new JArray();
var returnValue = new JObject();
returnValue["errors"] = errors;

if(root["CostAllocation"] != null)
{
if(businessSystemID != string.Empty)
{
root["CostAllocation"]["SenderBusinessSystemID"] = businessSystemID;
}

if(root["CostAllocation"]["ReferenceID"] != null)
{
var referenceIDValidator = @"^[A-Z0-9]{0,35}$";
var referenceID = root["CostAllocation"]["ReferenceID"];
valid = new Regex(referenceIDValidator, RegexOptions.IgnoreCase).Match(referenceID.ToString()).Success;
if(!valid)
{
var error = new JObject();
error["property"] = "ReferenceID";
error["validator"] = referenceIDValidator;
error["value"] = referenceID;
error["message"] = "No valid 'ReferencedId'";
errors.Add(error);
}
}

if(root["CostAllocation"]["UserID"] != null)
{
var userIDValidator = @"^[\w]{4,12}$";
var userID = root["CostAllocation"]["UserID"];
valid = new Regex(userIDValidator, RegexOptions.IgnoreCase).Match(userID.ToString()).Success;
if(!valid)
{
var error = new JObject();
error["property"] = "UserID";
error["validator"] = userIDValidator;
error["value"] = userID;
error["message"] = "No valid 'UserID'";
errors.Add(error);
}
}
...

if(errors.Count > 0)
{
throw new Exception(returnValue.ToString());
}

return root.ToString(Newtonsoft.Json.Formatting.None);
}</set-body>
<on-error> 中捕获异常,处理和格式化:
<on-error>
<choose>
<when condition="@(context.LastError.Message.Contains("Expression evaluation failed")==true)">
<set-status code="400" reason="Bad request" />
</when>
<otherwise>
<set-status code="500" reason="Error" />
</otherwise>
</choose>
<set-body template="none">@{
return context.LastError.Message.Replace("Expression evaluation failed.","").Trim();
}</set-body>
<base />
</on-error>
我们知道这种方法的编码工作量很大,并且更喜欢直接在 API 管理中原生支持的 JSON 模式检查。在后端处理模式检查并通过传递请求来增加延迟对我们来说不是一种选择。
我目前正在考虑的一种选择是在 API CI/CD 过程中解析 JSON 模式,生成通用验证并在 API 操作策略中替换它。

关于azure-api-management - 在 Azure API 管理器中验证 POST 请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47938343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com