是否可以从Azure API管理策略返回字节数组响应主体?

时间:2019-05-13 07:50:19

标签: azure-api-management

我有一个返回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管理在响应中返回我的字节数组吗?

3 个答案:

答案 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编码将其放入消息中。绝对是我们需要添加的东西。