Networking/VaRest Plugin2018. 12. 22. 17:59

http 요청 및 응답처리를 위한 VaRest 플러그인 사용법


언리얼 엔진 4.11 ~ 현재 최신버전(4.21)까지 지원하는 플러그인


설치 및 테스트


언리얼 마켓플레이스에서 VaRest 를 검색하고 엔진에 설치하기를 누른다

언리얼 엔진을 이용하여 프로젝트를 생성한다

편집 > 플러그인 > VaRest 활성화 체크 > 화면 우측하단 [지금 재시작] 버튼 누름

언리얼 에디터가 다시 실행되면 블루프린트 입력 가능한 곳에 아래의 내용을 입력한다



VaRest 플러그인 작동 테스트 (https://alyamkin.com/ 사이트에 대한 GET 방식 요청)



게임을 실행하고 키보드에서 T 키를 누르면 아래와 같이 게임화면에 http 응답문자열이 표시된다




PHP 무료 호스팅 서비스 이용하기

언리얼 프로젝트에서 접속할 웹서버가 필요할 때 PHP 무료계정을 이용하면 빠르고 쉽게 웹서버를 구축할 수 있다


무료 PHP 계정으로 유명한 infinityfree.net 은 다른 곳에 비해서 더 좋은 프로그래밍 환경을 제공하고 있지만 언리얼 엔진에서 접속하면 자바스크립트가 지원되지 않는 클라이언트라는 오류 메시지가 표시되면서 PHP가 실행되지 않는 문제가 있어서 아쉽지만 사용할 수가 없다


아래 예제에서 사용한 웹사이트 무료계정

awardspace.com


PHP에서 단순한 문자열을 응답하는 경우

<?php

  echo "Hello";

?>



여러개의 문자열을 쉼표로 구분하여 한개의 문자열로 응답하는 경우

<?php

  echo "Hello, World, Bye";

?>

위와 같은 경우에는 블루프린트에서 수신된 응답 문자열을 Parse into Array 노드를 이용하여 배열을 생성하고 ForEachLoop노드를 이용하여 모든 문자열을 화면에 표시할 수 있다



PHP 에서 간단한 JSON 문자열을 응답으로 출력하는 경우

<?php

  header('Content-type: application/json; charset:utf-8');

  $arr = array();

  $arr["login"] = true;

  $arr["error"] = false;

  $json = json_encode($arr);

  echo urldecode($json);

?>




POST 방식 요청으로 웹서버에 파라미터 전송하기


블루프린트에서 POST 요청을 전달하기 위해서는 위의 블루프린트에서도 생성한 적이 있는 RequestObject 객체의 Set String Field 노드를 이용하여 파라미터 이름, 값을 웹서버로 전송할 수 있다.



웹서버측에서 파라미터를 수신하는 예

<?php

  $ParamValue = $_REQUEST["Param Name"];

  echo ParamValue;

?>



PHP에서 JSON 문자열을 생성하여 클라이언트에게 응답하는 예

<?php

  header('Content-type: application/json; charset=UTF-8');

  $arr = array();

  $arr["login"] = true;

  $arr["error"] = false;

  $jsonStr = json_encode($arr);

  echo $jsonStr;

?>



PHP에서 MySQL 데이터베이스에 접속하는 예 ( http://unrealengine.epizy.com/mysql_test.php )


<?php


  $host='sql113.epizy.com';

  $user='epiz_23187906';

  $pass='HQpyNNHkYp';

  $db='epiz_23187906_User';


  $conn = mysqli_connect($host,$user,$pass,$db);

  if ($conn->connect_error) {

    die("Connection failed: " . $conn->connect_error);

  }

  if($conn) {

    echo "Connection successful"; 

    echo "<br>";

  }

 

  $select_query = "SELECT * FROM Player ";


  $result_set = mysqli_query($conn, $select_query);


  if (mysqli_num_rows($result_set) > 0) {

    while($row = mysqli_fetch_assoc($result_set)) {

        echo "Player ID: " . $row["PlayerID"]. " - Email: " . $row["Email"]. " - Game: " . $row["Game"]. "<br>";

    }

  } else {

    echo "0 results";

  }

  mysqli_close($conn);

?>



로그인 결과를 JSON 문자열로 응답하는 PHP(http://unreal.mywebcommunity.org/unreal_login.php?id=smith&pwd=smithpwd)

<?php

header('Content-type: application/json; charset=UTF-8');

  $id = $_REQUEST["id"];

  $pwd = $_REQUEST["pwd"];


  $result = "";

  

  // DB 코드 시작

  $host='fdb24.awardspace.net';

  $user='2915954_user';

  $pass='2915954Database';

  $db='2915954_user';


  $arr = array();

  

  $conn = mysqli_connect($host,$user,$pass,$db);

  if ($conn->connect_error) {

$arr["error"] = true;

        echo json_encode($arr);

return;

  }

  if($conn) {

    $arr["connection"] = true;

  }

 

  $select_query = "SELECT * FROM Member WHERE memid='$id' AND mempwd='$pwd' ";


  $result_set = mysqli_query($conn, $select_query);


  if (mysqli_num_rows($result_set) > 0) {

$arr["login"] = true;

  } else {

$arr["login"] = false;

  }

  mysqli_close($conn);

  $json = json_encode($arr);

  echo $json;

?>




VaRest 플러그인을 이용하여 GET 방식으로 위의 PHP에 로그인 요청하는 예

 - 서버측에서 JSON 문자열을 송신하여 언리얼 측에서 JSON 오브젝트를 수신





VaRest 플러그인을 이용하여 POST 방식으로 위의 PHP에 로그인 요청하는 예




localhost:3000/login 요청으로 실행되는 Node.js 웹서버 코드


var express = require('express');
var app = express();
var qs = require('querystring');

app.get('/login', function(req, res){
console.log("id=%s, pass=%s", req.query.id, req.query.pass);
login(req.query.id, req.query.pass, res);
});

app.post('/login', function(req, res){
var body = '';

req.on('data', function (data) {
body += data;
if (body.length > 1e6)
req.connection.destroy();
});

req.on('end', function () {
var post = qs.parse(body);
console.log("수신된 파라미터:"+post.id+", "+post.pass);
login(post.id, post.pass, res);
});
});

app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});


function login(empID, empName, res)
{
const oracledb = require('oracledb');
oracledb.getConnection(
{
user : "hr",
password : "hr",
connectString : "127.0.0.1/XEPDB1"
},
function(err, connection)
{
if(err){
console.error(err.message);
return;
}
console.log("오라클 접속 성공");
connection.execute(
"SELECT * FROM employees WHERE employee_id=:a AND first_name=:b",
[empID, empName],
{
maxRows:1
},
function(err, result)
{
var jsonObj = {};

if(err) {
console.error(err.message);
connection.close();
jsonObj.result = "Login Failed!";
} else{
//console.log(result.metaData); // Column names etc
console.log(result.rows);
if(result.rows.length>0) {
console.log("검색 성공")
jsonObj.result = "Login OK";
}else{
console.log("검색 실패")
jsonObj.result = "Login Failed!";
}
connection.close();
}
res.end(JSON.stringify(jsonObj));
}
); // end of execute()
}
); // end of getConnection()
}


Posted by cwisky