我有一个返回JSON对象的API,该对象的属性之一包含一些base64编码的二进制数据(PDF文件)。我想在此API的前面使用Azure API Management中的策略,以便响应仅返回已解码的二进制数据。
我可以将二进制数据解码为字节数组,但是要返回它,我需要使用该字节数组的内容更新响应主体(我也已相应地设置了内容类型标头)。机体策略是我尝试使用的策略:
<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的返回类型必须是字符串。我无法将二进制数据转换为字符串,因为它将被ASCII编码破坏。我不能直接尝试将值分配给context.Response.Body,因为它在策略中是只读的。
还有其他方法可以使Azure API管理在响应中返回我的字节数组吗?
答案 0 :(得分:1)
无论如何,响应都将是字符串,因此可以肯定地返回base64字符串是一种选择,不是吗?
另一种选择是构建一个包含您的字节为十六进制的字符串。例如“ 0xDEADBEEF”。
答案 1 :(得分:1)
现在完全可以按照您编写的方式进行:
<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>
另一个有趣的事情是,也可以通过策略设置以字节[]形式出现的证书:
<authentication-certificate body="@(context.Variables.GetValueOrDefault<byte[]>("byteCertificate"))" password="optional-certificate-password" />
查看此链接:microsoft.com/en-us/azure/api-management/api-management-authentication-policies
答案 2 :(得分:0)
目前这不可能。您必须返回字符串,并将使用UTF8编码将其放入消息中。绝对是我们需要添加的东西。