1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
#pragma once
#include "CoreMinimal.h" #include "Kismet/BlueprintAsyncActionBase.h" #include "Interfaces//IHttpRequest.h" #include "AsyncHttpRequest.generated.h"
USTRUCT(BlueprintType) struct FPositionItem { GENERATED_BODY()
FPositionItem(){} FPositionItem(FString _Latitude,FString _Longitude):Latitude(_Latitude),Longitude(_Longitude){}
UPROPERTY(BlueprintReadOnly) FString Latitude;
UPROPERTY(BlueprintReadOnly) FString Longitude; };
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FPosRequestCompleteDelegate,const FPositionItem&,Positon);
UCLASS() class SCHOOL_API UAsyncHttpRequest : public UBlueprintAsyncActionBase { GENERATED_BODY()
public: UAsyncHttpRequest();
UFUNCTION(BlueprintCallable,Category="AsyncHttp",meta=(BlueprintInternalUseOnly="true")) static UAsyncHttpRequest* AsyncHttpURLRequest(const FString& Url);
void HttpRequestStar(const FString& Url); void HttpRequest_PosRecHandle(FHttpRequestPtr Request,FHttpResponsePtr Response,bool bWasSuccess); UPROPERTY(BlueprintAssignable) FPosRequestCompleteDelegate PosOnSucceeded;
UPROPERTY(BlueprintAssignable) FPosRequestCompleteDelegate PosOnFailed; };
#include "AsyncHttpRequest.h" #include "HttpModule.h" #include "Interfaces/IHttpResponse.h"
UAsyncHttpRequest::UAsyncHttpRequest() { if(HasAnyFlags(RF_ClassDefaultObject) == false) { AddToRoot(); } }
UAsyncHttpRequest* UAsyncHttpRequest::AsyncHttpURLRequest(const FString& Url) { UAsyncHttpRequest* AsyncHttpRequest = NewObject<UAsyncHttpRequest>(); AsyncHttpRequest->HttpRequestStar(Url); return AsyncHttpRequest; }
void UAsyncHttpRequest::HttpRequestStar(const FString& Url) { TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest(); Request->SetVerb("GET"); Request->SetURL(Url); Request->OnProcessRequestComplete().BindUObject(this,&UAsyncHttpRequest::HttpRequest_PosRecHandle); Request->ProcessRequest(); }
void UAsyncHttpRequest::HttpRequest_PosRecHandle(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccess) { if(bWasSuccess && Response.IsValid() && EHttpResponseCodes::IsOk(Response->GetResponseCode())) { TSharedPtr<FJsonObject> JsonObj; TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(Response->GetContentAsString());
if(FJsonSerializer::Deserialize(JsonReader,JsonObj)) { FString PosString; if(JsonObj->TryGetStringField(TEXT("rectangle"),PosString)) { FPositionItem GetPosItem; bool IsReadSec = false; for(const auto& c : PosString) { if(c == ',') IsReadSec = true; else if(c == ';') break; else if(IsReadSec) GetPosItem.Latitude += c; else GetPosItem.Longitude += c; }
PosOnSucceeded.Broadcast(GetPosItem); RemoveFromRoot(); return ; } } }
PosOnFailed.Broadcast({}); RemoveFromRoot(); }
|