graphql-dotnet / graphql-client

A GraphQL Client for .NET Standard
MIT License
626 stars 133 forks source link

GraphQL subscription error missing header #662

Open kiennt300599 opened 1 month ago

kiennt300599 commented 1 month ago

I am trying to use AppSync for my project. Although I have handled everything according to the design documentation, I keep encountering the error: {"payload":{"errors":[{"message":"Required headers are missing.","errorCode":400}]},"type":"connection_error"} every time I create a subscription to listen. Is this a bug, or am I missing something? Please help me resolve this issue.

public static class AppSyncService { private static GraphQLHttpClient _client; private static IDisposable _subscription; private static string _apiUrl; private static string _wssUrl; private static string _apiKey; private static string _serverID; public static event Action OnNewItemReceived;

  public static void Initialize(string apiUrl, string wssUrl, string apiKey, string serverID)
  {
      _apiUrl = apiUrl;
      _wssUrl = wssUrl;
      _apiKey = apiKey;
      _serverID = serverID;

      ConnectToAppSync();
  }

  private static void ConnectToAppSync()
  {
      var options = new GraphQLHttpClientOptions
      {
          EndPoint = new Uri(_apiUrl),
          WebSocketEndPoint = new Uri(_wssUrl),
          WebSocketProtocol = "graphql-ws",
          MediaType = "application/json",
      };

      _client = new GraphQLHttpClient(options, new NewtonsoftJsonSerializer());
      _client.HttpClient.DefaultRequestHeaders.Add("x-api-key", _apiKey);

      Subscribe(_serverID);
  }

  private static void Subscribe(object variables)
  {
      try
      {
          var request = new GraphQLRequest
          {
              Query = @"
              subscription MySubscription($room_id: String!) {
                  onCreateMyChatMessageModel(room_id: $room_id) {
                      display_name
                      message_body
                      message_type
                      msg_id
                      room_id
                      timestamp
                      timestamp_msg_id
                      user_id
                  }
              }",
              Variables = variables
          };

          var subscriptionStream = _client.CreateSubscriptionStream<string>(request);

          _subscription = subscriptionStream.Subscribe(
          source =>
          {
              var newItem = source.Data;
              Debug.Log($"AppSync New item created: {newItem}");

              OnNewItemReceived?.Invoke(newItem);
          },
          error => Debug.Log($"AppSync error: {error.Message}"),

          () => Debug.Log("AppSync subscription completed."));
      }
      catch (Exception e)
      {
          Debug.Log($"AppSync subscribe error {e}");
      }
  }
  private static void Dispose()
  {
      _subscription?.Dispose();
      _client.Dispose();
      Debug.Log("AppSync subscription and client disposed.");
  }

}

rose-a commented 1 month ago

To add headers to the websocket connection, you need to configure them via GraphQLHttpClientOptions.ConfigureWebsocketOptions

kiennt300599 commented 4 weeks ago

@rose-a Thanks! I configured it following ConfigureWebsocketOptions, and now there are no more errors. However, I'm still not receiving any data from the websocket. So, I logged _subscription after Subscribe, and I received the following error:

System.Reactive.Linq.ObservableImpl.SelectMany2+ObservableSelector+_[System.Tuple2[GraphQL.GraphQLResponse1[System.String],System.Exception],GraphQL.GraphQLResponse1[System.String]]

Do you know what might be causing this? Please give me some ideas to resolve it.

rose-a commented 4 weeks ago

I've got no experience using AppSync myself, but there are people who got it working...

Perhaps this thread can help you: https://github.com/graphql-dotnet/graphql-client/issues/377