【问题标题】:Can custom headers be set for urql?可以为 urql 设置自定义标题吗?
【发布时间】:2020-03-05 16:35:34
【问题描述】:

Github GraphQL v4 API 具有所谓的 Schema Previews,您可以在其中使用新的架构功能 - 但它需要自定义 Accept 标头。

我以前用过 Apollo 客户端,但我想用 Formidables urlq 试试这个新应用。有没有办法用 urql 客户端设置客户标头?

更新

我认为这已进入代码库,只是没有记录在案 - https://github.com/FormidableLabs/urql/pull/96/files

【问题讨论】:

    标签: javascript github graphql urql


    【解决方案1】:

    对于异步令牌设置,您可以使用auth exchange

    import { createClient, dedupExchange, cacheExchange, fetchExchange } from 'urql';
    import { authExchange } from '@urql/exchange-auth';
    
    const getAuth = async ({ authState, mutate }) => {
      if (!authState) {
        const token = await getToken();
        const refreshToken = await getRefreshToken();
        if (token && refreshToken) {
          return { token, refreshToken };
        }
        return null;
      }
    
      return null;
    };
    
    const addAuthToOperation = ({ authState, operation }) => {
      if (!authState || !authState.token) {
        return operation;
      }
    
      const fetchOptions =
        typeof operation.context.fetchOptions === 'function'
          ? operation.context.fetchOptions()
          : operation.context.fetchOptions || {};
    
      return makeOperation(operation.kind, operation, {
        ...operation.context,
        fetchOptions: {
          ...fetchOptions,
          headers: {
            ...fetchOptions.headers,
            Authorization: authState.token,
          },
        },
      });
    };
    
    const client = createClient({
      url: '/graphql',
      exchanges: [
        dedupExchange,
        cacheExchange,
        authExchange({
          getAuthToken,
          addAuthToOperation,
        }),
        fetchExchange,
      ],
    });
    
    

    【讨论】:

    • 获得一些标头是很多废话。
    • 如果您已经缓存了令牌,这是一个更简单的实现。如果你想异步加载它,那就更复杂了。我使用这个实现是因为我们希望 firebase 在令牌过期时管理重新获取令牌,这是基于承诺的
    【解决方案2】:

    这是我使用的,它工作正常:

    const client = createClient({
      url: 'yoururl',
      fetchOptions: {
        headers: {
          'content-type': 'application/json',
          'x-hasura-admin-secret':'********'
        },
      },
    });
    

    【讨论】:

    • 对于浏览器,您希望使用可以经常更新的令牌。您可以使用令牌提供程序,例如 firebase auth 或 oauth。管理员密码是为服务器设计的,因为它们不经常更改并且不与许多用户共享。此外,管理员角色为请求提供管理员访问权限,因此您的访问规则不起作用
    【解决方案3】:

    查看源代码,以下urql createClient 对我有用:

    const client = createClient({
      url: 'https://api.github.com/graphql',
      fetchOptions: {
        headers: {
          Authorization: `bearer ${GITHUB_TOKEN}`,
          Accept: 'application/vnd.github.packages-preview+json',
        },
      },
    })
    

    更新

    实际上有比我原来的答案更好的方法。 createClient 接受 fetchOptions 的函数。因此,如果令牌存在,它将被添加到 Authorization 标头中

    const client = createClient({
      url: 'http://localhost:8000/graphql/',
      // add token to header if present
      fetchOptions: () => {
        const token = getToken()
        return token ? { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github.packages-preview+json' }} : {}
      },
    })
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2021-09-21
    • 1970-01-01
    • 2021-10-27
    • 2018-05-06
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多