【问题标题】:Typescript removes Authorization header from POST and PATCH fetch requestsTypescript 从 POST 和 PATCH 获取请求中删除授权标头
【发布时间】:2020-11-14 17:23:38
【问题描述】:

我使用 C# 构建了一个 API,该 API 使用 JWT 令牌进行授权。在前端,我将这些令牌存储在本地存储中并在创建请求时获取它们。创建 GET 或 DELETE 请求时,一切正常,使用 console.log() 我可以看到 fetch 选项添加了 Authorization 标头。但是,当使用 POST 或 PATCH 方法时,Authorization 标头在将其添加到对象后立即丢失。这是我的请求方法:

const send = async (apiOptions: ApiParams): Promise<FetchReturn> => {
    const accessToken = GetAccessToken()
    const options: ApiOptions = {
        method: apiOptions.method,
        headers: {
            Authorization: `Bearer ${accessToken}`
        }
    }

    console.log(options)

    if (apiOptions.data) {
        options.headers = {
            'Content-Type': 'application/json'
        }
        options.body = JSON.stringify(apiOptions.data)
    }

    const result = await fetch(`${getUrl()}/${apiOptions.path}`, options).then(res => res).catch(err => err)
    if (!result.ok) {
        if (IsExpired()) {
            const refreshResult = await fetch(`${getUrl()}/api/user/refresh`, {method: 'POST', headers:{
                'Content-Type': 'application/json'
            }, body: JSON.stringify(GetRefreshRequest())}).then(res => res).catch(err => err)
            if (refreshResult.ok) {
                Login(JSON.parse(await refreshResult.text()))

                return await send(apiOptions)
            } else if (refreshResult.status === 401) {
                Logout()
                window.location.reload()
                return { code: 0, text: ""}
            }
        }
    }
    const text = await result.text()
    return { code: result.status, text: text }

}

【问题讨论】:

    标签: javascript c# typescript


    【解决方案1】:

    我想在 POST 的 apiParams 中,您分配了属性“数据”,然后您有完全替换请求标头对象的 if 条件。 改成:

        options.headers['Content-Type'] = 'application/json';
    

    在标题中保留授权

    【讨论】:

    • 谢谢,这行得通。虽然它提出了一个问题,但为什么我分配数据之前的 console.log() 显示,授权标头不存在。
    • 我想,我可以回答你这个问题。您正在检查浏览器的登录 - 它实际上向您显示 {object} 之类的东西。然后单击它以查看其内容。问题是你看到对象的内容不是在它被记录的那一刻,而是你打开它的那一刻。将 console.log(options) 更改为 console.log(Json.serialize(options)) 你会看到你的授权头
    【解决方案2】:

    第一次查看你的apiOptions.data

    我认为,当您调用 POST/Patch 请求时它为空

    只需将console.log("...") 放在 if 语句中,然后尝试解决您的错误

    如果您的问题没有解决,请在我的帖子下重播

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 2014-12-16
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      相关资源
      最近更新 更多