HTTP 链接
使用 HTTP 获取 GraphQL 结果。
HttpLink
是一个终止链接,它通过 HTTP 将 GraphQL 操作发送到远程端点。Apollo Client 默认使用 HttpLink
,当您向 ApolloClient
构造函数提供 uri
选项时。
HttpLink
支持POST和GET请求,并且可以在每个操作级别上配置HTTP选项。您可以使用这些选项进行身份验证、持久化查询、动态URI和其他细粒度更新。
用法
导入 HttpLink
类并初始化链接如下:
import { HttpLink } from '@apollo/client';const link = new HttpLink({uri: "https://127.0.0.1:4000/graphql"// Additional options});
HttpLink
构造函数选项
该 HttpLink
构造函数接受一个选项对象,该对象可以包括以下字段。请注意,您还可以使用 操作上下文 在每个操作的基础上覆盖这些选项。
名称 类型 | 描述 |
---|---|
| 要发送请求的 GraphQL 端点的 URL。也可以是一个函数,该函数接受一个 默认值为 |
| 如果为真,则在发送到您的 GraphQL 端点的操作中包含 默认值为 |
| 发送 HTTP 请求到您的 GraphQL 端点时,而不是直接调用 Fetch API 时使用函数。此函数必须符合 默认情况下,如果您的运行环境不可用,则使用 Fetch API。 请参阅 自定义 |
| 表示包含在每个 HTTP 请求中的头部的对象,如 |
| 如果设置为 true,则头部名称不会自动转换为小写。这允许非 http-spec-compliant 服务器,这些服务器可能期望使用大写名称的头部。 默认值为 |
| 为每个 |
| 包含用于每个 请注意,如果您将 |
| 如果 默认值为 |
| 一个可选的函数,用于将 查询 或 变体 转换为字符串。它接受一个
默认情况下,使用裸露的 GraphQL |
上下文选项
HttpLink
在向您的 GraphQL 端点发送请求之前检查 当前操作的 context
中的某些值。先前链接链中的链接可以设置这些值以自定义 HttpLink
对每个操作的 行为。
名称 类型 | 描述 |
---|---|
| 要发送请求的 GraphQL 端点的 URL。也可以是一个函数,该函数接受一个 默认值为 |
| 代表要在 HTTP 请求中包含的标题的对象,例如 |
| 为此 |
| 一个对象,包含用于调用 请注意,如果您将 |
| 一个对象,配置高级 |
http
选项字段
名称 类型 | 描述 |
---|---|
| 如果为真,会在发送到你的 GraphQL 终端的操作中包含 默认值为 |
| 如果为 默认值是 |
| 如果设置为 true,则头部名称不会自动转换为小写。这允许非 http-spec-compliant 服务器,这些服务器可能期望使用大写名称的头部。 默认值为 |
操作结果
在你的 GraphQL 终端(成功)响应了发送的操作的结果后, HttpLink 将其设置为操作 context
的 response
字段。这允许链中的每个前置链接在响应返回之前与之交互。
处理错误
HttpLink
区分客户端错误、服务器错误和 GraphQL 错误。你可以将 onError
链接 添加到你的链接链中,通过回调处理这些错误。
以下类型的错误可能发生
Error | 描述 | 回调 | Error 类型 |
---|---|---|---|
Client Parse | 请求正文不可序列化,例如由于循环引用。 | error | ClientParseError |
Server Parse | 服务器响应无法解析(response.json()) | error | ServerParseError |
Server Network | 服务器响应该非 2xx 的 HTTP 状态码。 | error | ServerError |
Server Data | 服务器响应中没有包含 data 或 errors 。 | error | ServerError |
GraphQL Error | 解析 GraphQL 操作至少出现一个错误,它出现在 errors 字段中。 | next | 对象 |
因为许多服务器实现可以在服务器网络错误时返回有效的 GraphQL 结果,因此抛出的 Error
对象包含了解析后的服务器结果。服务器数据错误也会接收到解析后的结果。
所有错误类型都继承了从泛型javascript Error
对象继承的 name
、 message
和 nullable stack
属性。
//type ClientParseError{parseError: Error; // Error returned from response.json()};//type ServerParseError{response: Response; // Object returned from fetch()statusCode: number; // HTTP status codebodyText: string // text that was returned from server};//type ServerError{result: Record<string, any>; // Parsed object from server responseresponse: Response; // Object returned from fetch()statusCode: number; // HTTP status code};
自定义 fetch
您可以将 fetch
选项提供给 HttpLink
构造函数以启用许多自定义网络需求。例如,您可以根据计算得到的头部信息修改请求,或者基于 操作's 的详细信息计算端点 URI。
如果您针对的环境不支持 Fetch API(例如旧版本的浏览器或服务器)您可以根据需要提供不同的 fetch
实现。我们建议对旧版本的浏览器使用 unfetch
,在 Node 中运行时使用 node-fetch
。
自定义认证
此示例在调用 fetch
之前向每个请求添加自定义的 Authorization
头部:
const customFetch = (uri, options) => {const { header } = Hawk.client.header("http://example.com:8000/resource/1?b=1&a=2","POST",{ credentials: credentials, ext: "some-app-data" });options.headers.Authorization = header;return fetch(uri, options);};const link = new HttpLink({ fetch: customFetch });
动态 URI
此示例在调用 fetch
之前自定义端点 URL 的 查询 参数:
const customFetch = (uri, options) => {const { operationName } = JSON.parse(options.body);return fetch(`${uri}/graph/graphql?opname=${operationName}`, options);};const link = new HttpLink({ fetch: customFetch });