Skip to content

Instantly share code, notes, and snippets.

@Bioblaze
Created April 21, 2020 16:26
Show Gist options
  • Save Bioblaze/81c3b983b0475a8113c19b20ad7df113 to your computer and use it in GitHub Desktop.
Save Bioblaze/81c3b983b0475a8113c19b20ad7df113 to your computer and use it in GitHub Desktop.
Example of a Async Blueprint HTTP Call.
// Fill out your copyright notice in the Description page of Project Settings.
#include "loginUserClient.h"
#include "ClientSDK.h"
#include "ClientSDKStructs.h"
#include "ConfigCacheIni.h"
#include "Misc/MessageDialog.h"
#include "Interfaces/IHttpResponse.h"
#include "HttpModule.h"
#include "Dom/JsonObject.h"
#include "Modules/ModuleManager.h"
#include "Serialization/JsonWriter.h"
#include "Serialization/JsonReader.h"
#include "Serialization/JsonSerializer.h"
#include "Policies/CondensedJsonPrintPolicy.h"
#include "Runtime/Core/Public/Containers/Array.h"
#include "Runtime/Core/Public/Internationalization/Text.h"
#include "Runtime/JsonUtilities/Public/JsonObjectConverter.h"
UloginUserClient* UloginUserClient::loginUserClient(FString user_email, FString user_password)
{
UloginUserClient* HTTPQueryTask = NewObject<UloginUserClient>();
HTTPQueryTask->Start(user_email, user_password);
return HTTPQueryTask;
}
void UloginUserClient::Start(FString user_email, FString user_password)
{
TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();
HttpRequest->OnProcessRequestComplete().BindUObject(this, &UloginUserClient::HandleQuery);
HttpRequest->SetURL(TEXT("https://localhost/")); //CHANGE THIS
HttpRequest->SetVerb(TEXT("POST"));
HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json; charset=utf-8"));
TArray<FStringFormatArg> Args;
Args.Add(FStringFormatArg(TEXT("Bearer")));
FString UserSession;
if (FParse::Value(FCommandLine::Get(), TEXT("-cslogin="), UserSession)) {
Args.Add(FStringFormatArg(UserSession));
} else {
FMessageDialog::Open(EAppMsgType::Ok,TEXT("No Contact Systems User Session Found in Commandline Arguments."), TEXT("Contact Systems Error"));
}
FString Header = FString::Format(TEXT("{0} {1}"), Args);
HttpRequest->SetHeader(TEXT("Authorization"), Header);
TSharedPtr<FJsonObject> queryObject = MakeShareable(new FJsonObject);
TSharedPtr<FJsonObject> inputObject = MakeShareable(new FJsonObject);
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
JsonObject->SetStringField("email", user_email);
JsonObject->SetStringField("password", user_password);
inputObject->SetObjectField("input", JsonObject);
queryObject->SetStringField("operationName", TEXT("loginUser"));
queryObject->SetStringField("query", TEXT("mutation loginUser($input: LoginInput!) { loginUser(input: $input) { accessToken, expires, refreshToken } }"));
queryObject->SetObjectField("variables", inputObject);
FString OutputString;
TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString);
FJsonSerializer::Serialize(queryObject.ToSharedRef(), Writer);
HttpRequest->SetContentAsString(OutputString);
HttpRequest->ProcessRequest();
}
void UloginUserClient::HandleQuery(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{
FLoginDataServer Data;
if (bSucceeded) {
TSharedPtr<FJsonObject> JsonParsed;
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(HttpResponse->GetContentAsString());
if (FJsonSerializer::Deserialize(JsonReader, JsonParsed)) {
if (!JsonParsed->HasField(TEXT("errors"))) {
TSharedPtr<FJsonObject> DataParsed;
if (JsonParsed->TryGetObjectField(TEXT("data"), DataParsed)) {
TSharedPtr<FJsonObject> ObjParsed;
if (DataParsed->TryGetObjectField("loginUser")) {
if(FJsonObjectConverter::JsonObjectToUStruct(DataParsed, &Data, 0, 0)) {
OnSuccess.Broadcast(Data);
} else {
OnFail.Broadcast(Data);
}
} else {
OnFail.Broadcast(Data);
}
} else {
OnFail.Broadcast(Data);
}
} else {
OnFail.Broadcast(Data);
}
} else {
OnFail.Broadcast(Data);
}
} else {
OnFail.Broadcast(Data);
}
}
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "UObject/WeakObjectPtr.h"
#include "Interfaces/IHttpRequest.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "ClientSDKStructs.h"
#include "loginUserClient.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FloginUserClientDelegate, FLoginDataClient&, Response);
/**
*
*/
UCLASS()
class CLIENTSDK_API UloginUserClient : public UBlueprintAsyncActionBase
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", Keywords = "HTTP loginUserClient Query"), Category = "AsyncHTTP|API|Client")
static UloginUserClient* loginUserClient(FString user_email, FString user_password);
public:
UPROPERTY(BlueprintAssignable)
FloginUserClientDelegate OnSuccess;
UPROPERTY(BlueprintAssignable)
FloginUserClientDelegate OnFail;
public:
void Start(FString user_email, FString user_password);
private:
/** Handles json requests coming from the web */
void HandleQuery(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment