2017-03-31 41 views
0

an HTTP Action在Azure的邏輯應用程序調用a StackExchange API,從根本上,它可能是返回GZip or Deflate內容默認情況下,任何API:如何處理的GZip /放氣的HTTP操作

Azure Logic Apps: HTTP Action

因爲響應既不Plain Text nor JSON從HTTP動作的輸出是:

{ 
    "$content-encoding": "gzip", 
    "$content-type": "application/json; charset=utf-8", 
    "$content": "H4sIAAAAAAAEAGWPzY7CMAyE38XnqsrPFtq+ClpFoXghEkm6iVtWQrw7Lt3mAEd/Hs+M7+AIfYb+cIeAN2MHcjOaKWNiKCqgSPa6zZ2SFRzt6YzZjJiMd2EiZF0tvjbpuoZe7rrdxuZIC9KNLo5D9B4DLUIl2gpsyDfOeLflvN8JM7kYPnbF6/+WA/ZNYcOAI+Hp5V/eCKv0heVGSwD0SnRcZXQm4ewyM+hBCbmvda3aWjVaS3h8V3Cx2fiYuMePvWZcSrKV8faPSyzF1jmhty64cGbnVjyeRIHcnG0BAAA=" 
} 

如果通過去傳遞$content場的麻煩你最終會得到JSON的Gzip二進制表示,而且就我所能接受而言。

問題:我如何可以強制HTTP動作表現得像一個HttpClient和接受的GZip數據,並從行動發出JSON,或者更費力地採取gzip的Base64編碼/二進制數據,並進一步在行動之前解壓它?

+0

我會建議增加一個頭''接受編碼:identity''禁用gzip編碼,但它看起來像API不尊重這一點。 –

+0

我的確嘗試過,理論上HTTP操作應該負責協商內容,它似乎使用HttpClient而不配置自動解壓縮。 –

+0

我在我們的待辦事項上創建了一個自動執行此功能的功能,與此同時,您似乎可以通過函數解決它。 –

回答

0

我沒能找到一種方法來直接「解決」的問題,所以我創建了一個Azure Function與傳入HttpClient適當HttpClientHandler提出請求的網址:

#r "Newtonsoft.Json" 

using System; 
using System.Net; 
using Newtonsoft.Json; 

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log) { 
    string jsonContent = await req.Content.ReadAsStringAsync(); 
    dynamic data = JsonConvert.DeserializeObject(jsonContent); 

    if (data.url == null) { 
    return req.CreateResponse(HttpStatusCode.BadRequest, new { 
     error = "Please pass a URL in the input object" 
    }); 
    } 

    HttpClientHandler handler = new HttpClientHandler() { 
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
    }; 

    var client = new HttpClient(handler); 
    var result = await client.GetAsync((string)data.url); 
    var response = req.CreateResponse(HttpStatusCode.OK); 
    response.Content = result.Content; 
    return response; 
} 

通過交換內置從原來的問題HTTP動作,我能得到這個工作:

Working Flow

而且配置在Azure函數爲S:

Custom HTTP Action