Stream Chat Unreal SDK
Loading...
Searching...
No Matches
RequestBuilder.h
1// Copyright 2026 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
83 FRequestBuilder& Multipart(const FString& FieldName, const FString& FileName, const TArray<uint8>& Content, const FString& ContentType = {});
84
91 static TArray<uint8> BuildMultipartBody(
92 const FString& Boundary,
93 const FString& FieldName,
94 const FString& FileName,
95 const TArray<uint8>& Content,
96 const FString& ContentType);
97
107 template <class T>
108 FRequestBuilder& Json(const T& Struct, ENamingConvention NamingConvention = ENamingConvention::SnakeCase);
109 FRequestBuilder& EmptyJson();
110
116 void Send(TFunction<void(const FHttpResponse&)> Callback);
117
124 template <class T>
125 void Send(TFunction<void(const TResponse<T>&)> Callback);
126
127 void Resend();
128
129private:
130 FRequestBuilder& Json(const FString& Json);
131 void SendInternal();
132
133 TSharedPtr<const FHttpClient> Client;
134 FHttpRequestPtr Request;
135 FString BaseUrl;
136 FQueryParameters QueryParameters;
137 TFunction<void(const FHttpResponse&)> RetainedCallback;
138};
139
140template <class T>
141FRequestBuilder& FRequestBuilder::Json(const T& Struct, ENamingConvention NamingConvention)
142{
143 const FString JsonBody = Json::Serialize(Struct, NamingConvention);
144 return Json(JsonBody);
145}
146
147template <class T>
148void FRequestBuilder::Send(TFunction<void(const TResponse<T>&)> Callback)
149{
150 Send(
151 [Callback](const FHttpResponse& Response)
152 {
153 if (Callback)
154 {
155 Callback(TResponse<T>(Response));
156 }
157 });
158}
@ Text
Text of the message.
@ Query
Matches values by performing text search with the specified value.