开发者社区 > 云原生 > Serverless > 正文

大佬看看用的这个模板 OssSinkConnector只有python版本的代码 我用u

大佬看看用的这个模板 OssSinkConnector只有python版本的代码 我用unity c#不知道该传什么参数 变量名改多少 调用接口报这个错 WWW Error:502 Bad Gateway:{ "errorMessage": "the JSON object must be str, bytes or bytearray, not 'dict'", "errorType": "TypeError", "stackTrace": [ [ "File "/var/fc/runtime/python3/bootstrap.py"", "line 543", "in wsgi_wrapper", "body = request_handler(environ, start_response)" ], [ "File "/code/index.py"", "line 98", "in handler", "evt = json.loads(event)" ], [ "File "/var/fc/lang/python3/lib/python3.6/json/init.py"", "line 348", "in loads", "'not {!r}'.format(s.class.name))" ] ] }

the JSON object must be str, bytes or bytearray, not 'dict'"

展开
收起
芬奇福贵 2023-06-06 17:12:03 159 0
4 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    根据错误提示,可以看出对于该函数计算 Python 函数的事件参数 event,需要是一个 JSON 字符串类型的数据,而不是 Python 的 dict 类型。因此,你需要在 Unity C# 代码中将传递给该 Python 函数的参数转化为 JSON 字符串类型格式进行传递。

    具体来说,你可以使用 Newtonsoft.Json 库将 C# 对象序列化为 JSON 字符串后作为参数传递给 Python 函数。例如,在 Unity C# 代码中,可以使用如下方式来进行 JSON 格式化:

    using UnityEngine;
    using Newtonsoft.Json;
    
    public class TestFunctionCompute : MonoBehaviour
    {
        void Start()
        {
            // 将对象序列化为 JSON 字符串
            var data = new { key1 = "value1", key2 = 123 };
            string json = JsonConvert.SerializeObject(data);
    
            // 调用 Python 函数
            StartCoroutine(PostRequest(json));
        }
    
        IEnumerator PostRequest(string json)
        {
            // 设置 HTTP 请求参数
            WWWForm form = new WWWForm();
            form.AddField("event", json);
    
            // 发送 HTTP POST 请求
            using (var www = new WWW("<函数计算 Python 函数 URL>", form))
            {
                yield return www;
    
                if (!string.IsNullOrEmpty(www.error))
                {
                    Debug.LogError("WWW Error: " + www.error);
                }
                else
                {
                    Debug.Log("WWW Response: " + www.text);
                }
            }
        }
    }
    

    其中,JsonConvert.SerializeObject 方法将一个对象转化为 JSON 字符串,并在 HTTP POST 请求中将其作为 event 参数传递给函数计算 Python 函数。注意在请求时需要指定正确的函数计算 Python 函数的 URL。

    2023-06-07 12:05:41
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    根据您的描述,您使用了 OssSinkConnector 模板,但是该模板只提供了 Python 版本的代码,您想用 Unity C# 来调用该接口,但是不知道应该传递哪些参数,以及如何修改变量名。同时,您尝试调用接口时遇到了 502 Bad Gateway 的错误,并且提示了 JSON 对象必须是字符串类型。

    关于参数的传递和变量名的修改,您需要先了解该接口的具体实现,看看 Python 代码中都做了哪些事情,需要传递哪些参数,以及这些参数的数据类型和名称。然后再将这些参数和名称应用到 C# 代码中。通常来说,变量名称可以根据您的需要进行修改,但是参数的数据类型和名称需要与 Python 代码保持一致。

    关于 502 Bad Gateway 的错误,可能是因为您传递的参数类型不正确,导致无法正确解析 JSON 对象。您可以尝试将参数转换为字符串类型,或者将参数序列化为 JSON 对象后再传递。另外,您还需要检查网络连接是否正常,以及接口地址是否正确。

    最后,建议您参考该接口的文档和 Python 代码,了解该接口的具体实现和参数要求,然后再将这些知识应用到 C# 代码中。如果还有问题,可以提供更多的信息,便于更好地帮助您解决问题。

    2023-06-06 22:30:08
    赞同 展开评论 打赏
  • 不是参数名错了 调用的时候header加下类型试下吧 application/json

    此答案来自钉钉群“阿里函数计算官网客户"

    2023-06-06 18:06:37
    赞同 展开评论 打赏
  • 根据您提供的错误信息,是因为传递给接口的参数类型不正确导致的。

    具体来说,接口期望接收 str、bytes 或者 bytearray 类型的 JSON 对象,但是接收到了 dict(字典)类型的对象,因此报错。

    因为您使用的是Unity C#,所以需要将参数转换为字符串类型,然后再传递给接口。可以尝试使用JsonUtility.ToJson()方法将对象序列化为JSON字符串,然后再将JSON字符串转换为bytes或者字符串类型,再传递给接口。

    例如:

    c# using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking;

    public class Test : MonoBehaviour { // 接口地址和参数定义 private string apiUrl = "https://your-api-endpoint-url"; private Dictionary<string, string> postData = new Dictionary<string, string> { { "name", "test" }, { "age", "20" } };

    IEnumerator Start()
    {
        // 序列化post数据
        string postJson = JsonUtility.ToJson(postData);
        byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postJson);
    
        // 构造请求
        UnityWebRequest request = UnityWebRequest.Post(apiUrl, "");
        request.uploadHandler = new UploadHandlerRaw(postBytes);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
    
        // 发送请求
        yield return request.SendWebRequest();
    
        // 处理响应数据
        if (request.result == UnityWebRequest.Result.Success)
        {
            string responseJson = request.downloadHandler.text;
            Debug.Log(responseJson);
        }
        else
        {
            Debug.Log(request.error);
        }
    }
    

    } 在上面的代码中,我使用了UnityWebRequest来构造请求并发送请求。首先,我将postData字典对象序列化为JSON字符串,然后将JSON字符串转换为bytes类型,并通过UploadHandlerRaw上传到服务器。需要注意的是,在上传数据之前,需要设置请求头Content-Type为application/json。

    总之,您只需要将postData字典中的变量名改为您实际使用的变量名,再将apiUrl替换为您自己的接口地址,就可以使用上面的代码来调用接口了。

    2023-06-06 17:17:39
    赞同 展开评论 打赏

快速交付实现商业价值。

热门讨论

热门文章

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载