是否可以从 azure api-management 策略 return 字节数组响应 body?
Is it possible to return a byte array response body from azure api-management policy?
我有一个 API,其中 return 是一个 JSON object,其中一个属性包含一些 base64 编码的二进制数据(PDF 文件)。我想在此 API 前面使用 Azure API 管理中的策略,因此响应 return 只是解码后的二进制数据。
我可以将二进制数据解码为字节数组,但是要 return 它我需要用该字节数组的内容更新响应 body(我已经设置了 content-type header 相应也)。 set-body 策略是我尝试使用的策略:
<set-body>@{
var response = context.Response.Body.As<JObject>(true);
string content = response.Value<string>("content");
Byte[] bytes = Convert.FromBase64String(content);
return bytes; // Can't do this!
}</set-body>
上面的方法不起作用,因为 set-body 的 return 类型必须是字符串。我无法将二进制数据转换为字符串,因为它会被 ASCII 编码损坏。我无法直接尝试将值分配给 context.Response.Body,因为它在策略中是 read-only。
有没有其他方法可以让 Azure API 管理在响应中 return 我的字节数组?
无论如何,响应都将是一个字符串,因此返回 base64 字符串肯定是一个选项,不是吗?
另一种选择是构建一个包含您的字节的十六进制字符串。例如“0xDEADBEEF”。
目前这是不可能的。您必须 return 字符串,它将使用 UTF8 编码放入消息中。这绝对是我们需要添加的内容。
现在完全可以像您写的那样:
<set-body template="none">@{
var body = new JObject();
body["Message"] = "SGVsbG8gV29ybGQ=";
return Convert.FromBase64String(body["Message"].ToString());
}</set-body>
或不进行Base64转换:
<set-body template="none">@{
var body = new JObject();
body["Message"] = "Hello World";
return Encoding.UTF8.GetBytes(body["Message"].ToString());
}</set-body>
另一个有趣的事情是,也可以通过策略设置以 byte[] 形式出现的证书:
<authentication-certificate body="@(context.Variables.GetValueOrDefault<byte[]>("byteCertificate"))" password="optional-certificate-password" />
看到这个link:microsoft.com/en-us/azure/api-management/api-management-authentication-policies
我有一个 API,其中 return 是一个 JSON object,其中一个属性包含一些 base64 编码的二进制数据(PDF 文件)。我想在此 API 前面使用 Azure API 管理中的策略,因此响应 return 只是解码后的二进制数据。
我可以将二进制数据解码为字节数组,但是要 return 它我需要用该字节数组的内容更新响应 body(我已经设置了 content-type header 相应也)。 set-body 策略是我尝试使用的策略:
<set-body>@{
var response = context.Response.Body.As<JObject>(true);
string content = response.Value<string>("content");
Byte[] bytes = Convert.FromBase64String(content);
return bytes; // Can't do this!
}</set-body>
上面的方法不起作用,因为 set-body 的 return 类型必须是字符串。我无法将二进制数据转换为字符串,因为它会被 ASCII 编码损坏。我无法直接尝试将值分配给 context.Response.Body,因为它在策略中是 read-only。
有没有其他方法可以让 Azure API 管理在响应中 return 我的字节数组?
无论如何,响应都将是一个字符串,因此返回 base64 字符串肯定是一个选项,不是吗?
另一种选择是构建一个包含您的字节的十六进制字符串。例如“0xDEADBEEF”。
目前这是不可能的。您必须 return 字符串,它将使用 UTF8 编码放入消息中。这绝对是我们需要添加的内容。
现在完全可以像您写的那样:
<set-body template="none">@{
var body = new JObject();
body["Message"] = "SGVsbG8gV29ybGQ=";
return Convert.FromBase64String(body["Message"].ToString());
}</set-body>
或不进行Base64转换:
<set-body template="none">@{
var body = new JObject();
body["Message"] = "Hello World";
return Encoding.UTF8.GetBytes(body["Message"].ToString());
}</set-body>
另一个有趣的事情是,也可以通过策略设置以 byte[] 形式出现的证书:
<authentication-certificate body="@(context.Variables.GetValueOrDefault<byte[]>("byteCertificate"))" password="optional-certificate-password" />
看到这个link:microsoft.com/en-us/azure/api-management/api-management-authentication-policies