Azure Function对接Slack API互联与快捷方式时出现500错误
问题排查与修复方案
错误原因分析
你遇到的Unexpected character encountered while parsing value: p...错误,核心原因是Slack发送的请求体不是纯JSON格式,而是application/x-www-form-urlencoded类型的表单数据,内容开头为payload=,直接对整个请求体做JSON反序列化自然会失败(开头的'p'不是JSON合法起始字符)。
排查步骤
- 确认请求实际内容:在函数中添加日志,输出请求的
Content-Type和原始请求体,明确Slack发送的数据格式:
log.LogInformation($"Content-Type: {req.ContentType}"); string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); log.LogInformation($"Raw Request Body: {requestBody}");
运行后查看日志,你会发现请求体类似payload={"type":"shortcut","token":"xxx",...},这是Slack快捷方式/互联请求的标准格式。
- 修正端点URL:你的函数URL结尾带有多余的
?,需要删除,正确的端点URL应为:https://<namehere>.azurewebsites.net/api/events/slack
代码修复方案
针对Slack的表单格式请求,需要先解析表单数据,取出payload字段后再做JSON反序列化:
[FunctionName("abc123")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "events/slack")] HttpRequest req, ILogger log) { log.LogInformation($"Content-Type: {req.ContentType}"); string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); log.LogInformation($"Raw Request Body: {requestBody}"); dynamic data = null; // 处理Slack的form-urlencoded格式请求 if (req.ContentType?.Contains("application/x-www-form-urlencoded") == true) { var formData = await req.ReadFormAsync(); var payload = formData["payload"]; if (!string.IsNullOrEmpty(payload)) { data = JsonConvert.DeserializeObject(payload); log.LogInformation($"Parsed Payload Type: {data.type}"); } } // 兼容纯JSON请求(如Slack事件订阅场景) else if (req.ContentType?.Contains("application/json") == true) { data = JsonConvert.DeserializeObject(requestBody); } return new OkObjectResult("cool"); }
后续注意事项
修复后测试功能正常的话,后续需要添加Slack请求签名验证,确保请求确实来自Slack,避免恶意请求。
内容的提问来源于stack exchange,提问作者mharre
相关产品推荐
相关产品推荐

