Stream Chat Unreal SDK
Loading...
Searching...
No Matches
RequestBuilder.h
1// Copyright 2022 Stream.IO, Inc. All Rights Reserved.
2
3#pragma once
4#include "CoreMinimal.h"
5#include "HttpResponse.h"
6#include "Interfaces/IHttpRequest.h"
7#include "QueryParameters.h"
8#include "StreamJson.h"
9
10class FHttpClient;
11
12DECLARE_LOG_CATEGORY_EXTERN(LogHttpClient, Verbose, All);
13
14template <class T>
15struct TResponse
16{
17public:
18 // Deserialize response if success
19 explicit TResponse(const FHttpResponse& Response)
20 {
21 if (Response.IsSuccessful())
22 {
23 ResponseOrError.template Set<T>(Response.Json<T>());
24 }
25 else
26 {
27 ResponseOrError.template Set<FString>(TEXT("Error"));
28 }
29 }
30
31 bool IsSuccessful() const
32 {
33 return ResponseOrError.template IsType<T>();
34 }
35
36 // Get a pointer to the held response, or nullptr if error
37 const T* Get() const
38 {
39 return ResponseOrError.template TryGet<T>();
40 }
41
42 // Get a ref to the held response if you're SURE this isn't an error
43 const T& GetRef() const
44 {
45 return ResponseOrError.template Get<T>();
46 }
47
48private:
49 TVariant<T, FString> ResponseOrError;
50};
51
52class HTTPREQUESTS_API FRequestBuilder
53{
54public:
55 FRequestBuilder() = delete;
56
57 explicit FRequestBuilder(const TSharedRef<const FHttpClient>&, const FString& Verb, const FString& Url);
58
65 FRequestBuilder& Header(const FQueryParameters& Headers);
66
67 FRequestBuilder& Body(const FString& Text);
68 FRequestBuilder& Query(const FQueryParameters& Query);
69
79 template <class T>
80 FRequestBuilder& Json(const T& Struct, ENamingConvention NamingConvention = ENamingConvention::SnakeCase);
81 FRequestBuilder& EmptyJson();
82
88 void Send(TFunction<void(const FHttpResponse&)> Callback);
89
96 template <class T>
97 void Send(TFunction<void(const TResponse<T>&)> Callback);
98
99 void Resend();
100
101private:
102 FRequestBuilder& Json(const FString& Json);
103 void SendInternal();
104
105 TSharedPtr<const FHttpClient> Client;
106 FHttpRequestPtr Request;
107 FString BaseUrl;
108 FQueryParameters QueryParameters;
109 TFunction<void(const FHttpResponse&)> RetainedCallback;
110};
111
112template <class T>
113FRequestBuilder& FRequestBuilder::Json(const T& Struct, ENamingConvention NamingConvention)
114{
115 const FString JsonBody = Json::Serialize(Struct, NamingConvention);
116 return Json(JsonBody);
117}
118
119template <class T>
120void FRequestBuilder::Send(TFunction<void(const TResponse<T>&)> Callback)
121{
122 Send(
123 [Callback](const FHttpResponse& Response)
124 {
125 if (Callback)
126 {
127 Callback(TResponse<T>(Response));
128 }
129 });
130}
@ Text
Text of the message.
@ Query
Matches values by performing text search with the specified value.