网络层

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 接口的更多信息。