Relay具有网络层抽象,将 mutation 和查询及将请求发送到GraphQL服务器的实际主机分离。 这使我们能够通过配置甚至完全来替代默认网络层的灵活性。
Relay 预配置为与express-graphql一起使用作为默认网络层。 默认网络层公开 Relay.DefaultNetworkLayer
以供使用。
默认情况下,Relay 假设 GraphQL 在相对于应用程序服务根路径的 /graphql
路径服务。这可以通过注入默认网络层的自定义实例来重新配置。
Relay.injectNetworkLayer( new Relay.DefaultNetworkLayer('http://example.com/graphql') );
在这背后,默认的网络层使用 fetch (Living Standard)。Relay.DefaultNetworkLayer
的构造函数接受任何有效的初始化属性的可选的第二个参数 fetch
。
Relay.injectNetworkLayer( new Relay.DefaultNetworkLayer('http://example.com/graphql', { credentials: 'same-origin', }) );
当它发送查询时,它将在15秒超时后自动请求失败。此外,失败的请求会自动重试两次,分别为延迟1秒,延迟3秒。
像GraphQL URI一样,可以配置超时和重试行为
Relay.injectNetworkLayer( new Relay.DefaultNetworkLayer('http://example.com/graphql', { fetchTimeout: 30000, // Timeout after 30s. retryDelays: [5000], // Only retry once after a 5s delay. }) );
与查询不同,不会自动重试针对 mutation 的失败请求。
可以通过提供一个 headers
对象来配置自定义HTTP头:
Relay.injectNetworkLayer( new Relay.DefaultNetworkLayer('http://example.com/graphql', { headers: { Authorization: 'Basic SSdsbCBmaW5kIHNvbWV0aGluZyB0byBwdXQgaGVyZQ==', }, }) );
Relay 还允许我们完全替代默认的网络层。
自定义网络层必须符合以下 RelayNetworkLayer 接。 虽然默认网络层是接受某种配置的实例类,但这不是注入网络层的要求。
例如,网络层可以是符合接口的简单对象:
var myNetworkLayer = { sendMutation(mutationRequest) { // ... }, sendQueries(queryRequests) { // ... }, supports(...options) { // ... }, }; Relay.injectNetworkLayer(myNetworkLayer);
您可以阅读有关API RelayNetworkLayer 接口的更多信息。