可通过 Postman 调用 https Firebase Cloud Functions:“请求的 Content-Type 不正确。”

Posted

技术标签:

【中文标题】可通过 Postman 调用 https Firebase Cloud Functions:“请求的 Content-Type 不正确。”【英文标题】:Callable https Firebase Cloud Functions via Postman: "Request has incorrect Content-Type. " 【发布时间】:2021-06-25 11:10:24 【问题描述】:

我正在尝试在本地测试我的可调用 Firebase 云函数。

我知道这需要是一个发布请求,并且需要有一个 Content-Typeapplication/json 以及请求正文中的一个数据对象。

这是我在请求中的原始正文:


    "Content-Type": "application/json",
    "data": 
        "aString": "some string",
    

在我得到的响应正文中:


    "error": 
        "message": "Bad Request",
        "status": "INVALID_ARGUMENT"
    

在终端我得到:

>  "severity":"WARNING","message":"Request has incorrect Content-Type. "
>  "severity":"ERROR","message":"Invalid request, unable to process."

如何格式化正文以获得正确的Content-Type

更新:

似乎 Postman 中使用的 Content-Type 必须在正文中而不是标题中:

Postman 请求的其余部分:

还有我的云功能:

// eslint-disable-next-line import/no-unresolved
const functions = require('firebase-functions');
// eslint-disable-next-line import/no-unresolved
const connectyCube = require('connectycube');

exports.createSession = functions.https.onCall(async (data, context) => 
    if (context.auth) 
        const appId = functions.config().cc.appid;
        const authKey = functions.config().cc.authkey;
        const authSecret = functions.config().cc.authsecret;

        const CREDENTIALS = [
            
                appId,
                authKey,
                authSecret,
            ,
        ];

        connectyCube.init(...CREDENTIALS);

        const getSession = () => new Promise((resolve, reject) => 
            connectyCube.createSession((error, session) => 
                if (session) 
                    resolve(session);
                
                console.error('FUNCTION ERROR', error)
                reject(error);
            );
        );
        const session = await getSession();
        return session;
    
    return new Error('App authorization error');
);

【问题讨论】:

你的云功能是什么样的?您还可以分享您的邮递员请求的屏幕截图吗? 谢谢@Dharmaraj,完成。 在 Postman 中,您会在 GraphQL 选项旁边看到粗体的蓝色“文本”,如果您单击它并选择 JSON,它将为您设置标题。现在,您正在发送纯文本并手动添加标题作为解决方案。如果您为原始身体选择合适的类型,邮递员会照顾到这一点。 【参考方案1】:

尝试将 "content-type": "application/json" 移动到标头中并再次请求。

【讨论】:

感谢@Muhammed,我已经更新了问题,因为您似乎只能更新正文中的内容类型。【参考方案2】:

如果您想通过 HTTPS 请求(而不是使用其中一个客户端 SDK)直接调用 Callable Cloud Function,您的请求需要遵循 Protocol specifications for https.onCall,因为“Cloud Functions 的 https.onCall 触发器是 HTTPS 触发器请求和响应的特定格式”。

【讨论】:

谢谢 - 据我所知,我已经遵循了该文档中的所有规范。【参考方案3】:

您应该在标题中传递application/json,而不是在正文中。

这应该会在标题选项卡中自动将标题更改为application/json。 请尝试从该下拉菜单切换到 JSON 并将您的正文更改为:


  "aString": "some string"

【讨论】:

【参考方案4】:

自我回答,但这不起作用的原因是因为需要以这种特定方式将自定义标头添加到 Postman 中的请求中:

https://***.com/a/68040185/11584105

【讨论】:

以上是关于可通过 Postman 调用 https Firebase Cloud Functions:“请求的 Content-Type 不正确。”的主要内容,如果未能解决你的问题,请参考以下文章

postman读取外部文件参数化

如果超时或无法访问服务器,Fire base 不会调用 onCancelled

可通过https获取远端www服务版信息,怎么解决

使用Postman进行简单压力测试

一文带你全面解析postman工具的使用(效率篇)

设置 Postman 环境并调用 API