从Logic App传Dropbox文件内容到Azure Function遇媒体类型错误如何解决?
解决Azure Function接收CSV内容时的UnsupportedMediaType错误
这个错误的根源很清晰——你的Azure Function WebHook端点只接受JSON格式的请求体,但你直接传递了原始的CSV内容,所以触发了UnsupportedMediaType错误。下面是具体的解决步骤,适配不同的实现方式:
1. 将CSV内容包装为JSON结构
不管你用的是低代码工作流工具(比如Make、Zapier)还是自定义代码,核心操作都是把CSV内容放进一个JSON对象的属性里,让请求体符合要求。
举个简单的JSON结构示例:
{ "csvContent": "完整的CSV文件内容字符串", "fileName": "example.csv" }
如果是用Python自定义代码发起请求,你可以这样构造:
import json import requests # 读取CSV文件内容 with open("target.csv", "r") as f: csv_content = f.read() # 构造JSON请求体 payload = json.dumps({ "csvContent": csv_content, "fileName": "target.csv" }) # 调用Azure Function response = requests.post( "https://your-function-name.azurewebsites.net/api/YourFunction", data=payload, headers={"Content-Type": "application/json"} )
2. 确保请求头设置正确
调用Azure Function时,一定要在请求头里添加Content-Type: application/json——这是WebHook验证请求格式的关键。
如果你用的是低代码工具,在HTTP请求步骤的「请求头」配置里手动添加这个键值对即可;如果是代码实现,就像上面Python示例里那样,在headers参数中指定。
3. 在Azure Function中解析JSON获取CSV内容
接下来需要在Azure Function里读取JSON请求体,提取出CSV内容再做后续处理。这里提供两种常见语言的示例:
C# Azure Function
using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace CsvProcessingFunction { public static class ProcessCsv { [FunctionName("ProcessCsv")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("Received CSV processing request."); string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); // 提取CSV内容和文件名 string csvContent = data?.csvContent; string fileName = data?.fileName; if (string.IsNullOrEmpty(csvContent)) { return new BadRequestObjectResult("请求体中缺少csvContent字段"); } // 这里添加你的CSV处理逻辑,比如用CsvHelper解析内容 // ... return new OkObjectResult($"已成功处理文件:{fileName}"); } } }
Python Azure Function
import azure.functions as func import json import csv from io import StringIO def main(req: func.HttpRequest) -> func.HttpResponse: try: # 解析JSON请求体 req_body = req.get_json() csv_content = req_body.get('csvContent') file_name = req_body.get('fileName', 'unknown.csv') if not csv_content: return func.HttpResponse( "请在请求体中提供csvContent字段", status_code=400 ) # 将CSV字符串转为可读取的流,逐行处理 csv_reader = csv.reader(StringIO(csv_content)) for row in csv_reader: # 处理每一行数据的逻辑 print(f"处理行:{row}") return func.HttpResponse(f"文件 {file_name} 处理完成") except Exception as e: return func.HttpResponse( f"处理CSV时出错:{str(e)}", status_code=500 )
额外优化:直接将CSV转为JSON数组传递
如果你的工作流工具支持(比如Make有内置的「CSV to JSON」模块),可以先把CSV内容转换成JSON数组再传递给Azure Function。这样在Function里就不需要再解析CSV字符串,直接处理JSON数据即可,更高效也更不易出错。
内容的提问来源于stack exchange,提问作者Bernard
相关产品推荐
相关产品推荐

