腾讯云函数对接失败

腾讯云函数对接失败

提示如下:

https://img1.sycdn.imooc.com/climg/c837eb68097e221617770727.jpg

使用postman测试是成功:


https://img1.sycdn.imooc.com/climg/77264768097e223014000847.jpg


测试的配置如下:

https://img1.sycdn.imooc.com/climg/d3e34268097e226413140697.jpg

后端代码修改成了:

https://img1.sycdn.imooc.com/climg/9a382868097e228415210762.jpg

def _request_cloud_function(self, code: str, *args, **kwargs):
    """将函数发送给腾讯云函数去执行,并获取到结果"""
    # 1.组装请求数据
    payload = {
        'body': {
            "code": code,
            "func_name": "main",
            "args": args,
            "kwargs": kwargs
        }
    }
    # payload = {
    #         "code": code,
    #         "func_name": "main",
    #         "args": args,
    #         "kwargs": kwargs
    #     }

    headers = {"Accept": "application/json"}

    # 2.发送请求
    resp = requests.post(
        "https://1354924555-3953ks20ij.ap-guangzhou.tencentscf.com",
        data=json.dumps(payload),
        headers=headers
    )
    resp.raise_for_status()
    resp_json = resp.json()

    # 3.处理响应
    return resp_json.get("body")

两种payload方式都尝试了,收到的不是400错误就是500错误

云函数的信息如下:

https://img1.sycdn.imooc.com/climg/2c691d68097e22e913760943.jpg

https://img1.sycdn.imooc.com/climg/17771668097e22f913700714.jpg

https://img1.sycdn.imooc.com/climg/a2032468097e230e13650483.jpg

请老师帮忙看看是哪里问题吧

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

看下前端控制台发起请求的code数据,看下是不是前端的textarea标签将数据加了大量的\n\t之类的符号,导致对应的代码没被正确识别出来,所以导致腾讯云服务器提示没找到对应的函数。


测试方法:将前端api接口传递的code代码复制到直联的postman接口上进行测试,这段确定没问题后,在排查后续可能的问题。

  • 曲别针010 提问者 #1

    经过老师指导问题已解决,谢谢老师。

    测试没问题的云函数和后端部分的代码如下:

    # 云函数:
    import json
    import sys
    import base64
    import datetime
    import hashlib
    import math
    from urllib import parse as urlparse
    
    def main_handler(event, context):
        """
        主处理函数,用于处理传入的事件并执行相应逻辑
        :param event: 包含请求信息的事件对象,通常包含请求体等内容
        :param context: 上下文对象,包含执行环境等相关信息(此处未实际用到)
        :return: 包含状态码和响应体的字典,用于返回处理结果
        """
        try:
            # 从 event 中获取请求体,若不存在则用空字典
            body = json.loads(event.get("body", "{}"))
            # 从请求体中提取相关参数
            code = body.get("code", "")
            func_name = body.get("func_name", "")
            params = body.get("params", [])
            print("code:", code)
            print("func_name:", func_name)
            print("params:", params)
    
            # 创建自定义全局命名空间
            exec_globals = {
                '__builtins__': __builtins__,
                'sys': sys,
                'json': json,
                'math': math,
                'datetime': datetime,
                'hashlib': hashlib,
                'base64': base64,
                'urlparse': urlparse  # 使用别名
            }
    
            # 执行传入的代码,限定内置函数环境,将执行后的变量存入 exec_globals
            exec(code, exec_globals)
    
            # 检查指定函数是否在执行后的全局变量中且可调用
            if func_name in exec_globals and callable(exec_globals[func_name]):
                # 调用函数并获取结果
                result = exec_globals[func_name](params)
                # 返回成功响应,包含状态码 200 和执行结果
                return {
                    "statusCode": 200,
                    "body": json.dumps({"result": result})
                }
            else:
                # 函数不存在或不可调用时返回的错误响应
                return {
                    "statusCode": 400,
                    "body": json.dumps({"error": "Function not found or not callable"})
                }
        except Exception as e:
            # 捕获异常时返回的错误响应,包含状态码 500 和异常信息
            return {
                "statusCode": 500,
                "body": json.dumps({"error": str(e)})
            }
    # 后端增加对接云函数的代码
    def _request_cloud_function(self, code: str, params: dict):
        """将函数发送给腾讯云函数去执行,并获取到结果"""
        url = os.getenv('CLOUD_FUNC_URL')
        # 1.组装请求数据
        payload = {
            "code": code,
            "func_name": "main",
            "params": params,
        }
        headers = {"Content-Type": "application/json"}
        # 2.发送请求
        # resp = requests.request('POST', url=url, json=payload, headers=headers)
        resp = requests.request('POST', url=url, data=json.dumps(payload), headers=headers)
        # resp = requests.post(url=url, json=payload, headers=headers)
        resp.raise_for_status()
    
        # 3.处理响应
        return resp.json()

    然后再invoke中引用该函数

    https://img1.sycdn.imooc.com/climg/bf44db6809836af615480789.jpg


    整理分享几个要点:

    1、最上方的问题主要是_request_cloud_function的headers中设置错误,应该是设置Content-Type为json,表示发送的负载数据是json格式,这是是必须的,否则云函数那边会解析错误,而不是Accept json数据(表示接受的响应数据是json):

    https://img1.sycdn.imooc.com/climg/6f9a816809836bbf13730631.jpg

    更正后,简单测试下加减法的函数已经成功了


    2、但如果是类似于课程之前的计算快递查询的签名一样的函数,其中import了几个包,这类函数在执行的时候,云函数就会报错__import__ not found:

    https://img1.sycdn.imooc.com/climg/5fb31b6809836c4013350739.jpg

    经过沟通发现,云函数沙箱等环境有安全保护措施,exec执行的函数不能随便import。可以预先导入常用的模块,方式如下:

    https://img1.sycdn.imooc.com/climg/1047096809836cbf11220716.jpg


    3.关于urllib.parse的导入需要使用别名

    在云函数中:

    from urllib import parse as urlparse
    
    # 创建自定义全局命名空间
    exec_globals = {
        '__builtins__': __builtins__,
        'sys': sys,
        'json': json,
        'math': math,
        'datetime': datetime,
        'hashlib': hashlib,
        'base64': base64,
        'urlparse': urlparse  # 使用别名
    }


    在llmops平台中Python代码节点就直接使用urlparse.quote,举例之前的快递鸟签名函数:

    def main(params):
        # 构造快递鸟签名
        # 1.将RequestData和ApiKey拼接
        request_data = {'LogisticCode': f'{params.get("logistic_code")}'}
        api_key = '00edcf20-97e3-42e8-90ba-fec4b7be796b'
        combined_data = json.dumps(request_data) + api_key
    
        # 2.MD5加密并转换成小写
        md5_hash = hashlib.md5(combined_data.encode('utf-8')).hexdigest()
    
        # 3.Base64编码
        base64_encode = base64.b64encode(md5_hash.encode('utf-8')).decode('utf-8')
    
        # 4.URL编码------------------------这里直接使用urlparse.quote
        url_encoded = urlparse.quote(base64_encode)
    
        return {
            "RequestType": 8002,
            "EBusinessID": 1891677,
            "DataSign": url_encoded,
            "RequestData": urlparse.quote(json.dumps(request_data))
        }


    2025-07-25 19:43:59
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
AI Agent 全栈开发工程师
  • 参与学习       500    人
  • 解答问题       404    个

全流程打造你自己的(Coze/Dify)低代码智能体开发平台;2025年入行正当时,企业急需,人才稀缺,竞争小;无论入行还是转行,首选口碑好课,门槛低、成长高

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师