음..


이번에는 코드이그나이터4의 도큐멘트에서 당당하게 등재되어있는 API 기능을 써봤습니다.


물론 재대로 잘 되면 글 안적.. (.. .. ..)


<?php namespace App\Controllers;
use App\Libraries\Controller;
use CodeIgniter\API\ResponseTrait;
class Stats extends Controller {
use ResponseTrait;
public function api () {
$data = [
"total_users" => 3,
"users" => [
[
"id" => 1,
"name" => "Nitya",
"address" => [
"country" => "India",
"city" => "Kolkata",
"zip" => 700102,
]
],
[
"id" => 2,
"name" => "John",
"address" => [
"country" => "USA",
"city" => "Newyork",
"zip" => "NY1234",
]
],
[
"id" => 3,
"name" => "Viktor",
"address" => [
"country" => "Australia",
"city" => "Sydney",
"zip" => 123456,
]
],
]
];
return $this->respond($data);
}
}


위와 같이 작성해서 URL을 접속해보시면 정상적으로 작동하는것을 볼 수 있습니다.

(기본 데이터는 코드이그나이터4에 있는 데이터를 그대로 사용했습니다.)



단, XML로 동작합니다.

(왜인지는 모르겠지만..)


아마 사이트에서 단일 포맷을 쓰는걸 상정한거 같은데..


application/Config/Format.php 에서 $supportedResponseFormats, $formatters의 변수를 사용하실 포맷으로 수정하시면 됩니다.


코드를 보시면 json과 xml이 선언되어있습니다.



저중에서 사용할거 제외하고 삭제하시면 아마 한가지로만 동작이 재대로 될거라 생각합니다. (아마도..?)


하지만, 필자는 json과 xml을 동시에 사용하는걸 상정해서 만들어보고 있어서..


그거를 해보겠습니다.


일단 도큐멘트를 보시면 Negotiation 이라는거를 사용해보라고 합니다.


근데, 사실 Negotiation 안써도 상관이 없.. (.. .. ..)



위와 같이 코드를 삽입해주면 json 방식으로 웹사이트를 여는것이 가능합니다.


$config = new \Config\Format();
$this->formatter = $config->getFormatter('application/json');
$this->response->setContentType('application/json');


상단의 코드를 리턴해서 echo 를 해보면, 'application/json' 가 나옵니다.

(즉, 딱히 쓸모없는 코드.. 함수에 들어가서 봐도 특별한 작업은 진행하지 않습니다.)


$config = new \Config\Format();

$this->formatter = $config->getFormatter('application/json');


$this->formatter 에 사용할 포맷의 클래스를 넣어줘야 합니다.


자세한것은 system/API/ResponseTrait.php 의 format() 함수를 확인하시면 됩니다.



348 라인을 보시면 아시겠지만, $this->formatter 변수가 존재하지 않으면 위에서 json으로 설정한 작업을 다시 처음부터 하게됩니다.

(즉, xml로 직행..)


$this->response->setContentType('application/json');


그리고 헤더의 컨텐츠타입을 html에서 json으로 교체해줍니다.


교체하지 않으면 html로 인식하게 됩니다.


저처럼 Filters 에서 레이아웃이랑을 씌우게 되면, html로 인식을 하기는 하는데, 레이아웃이 망가지게 됩니다.

(애초에 레이아웃 파트를 불러오는 시점에서 문제점이..)


[CodeIgniter 4 pre-alpha1 사용기] CodeIgniter 4 레이아웃 작업을 하던 후커가 사라졌다!?


에 보시면 if (!is_cli() && CI_DEBUG && strpos($format, 'html') !== false) { 라고 코드를 작성한적이 있습니다.


컨텐츠 타입이 html이면 작동하라는 의미죠.

(과거 코드이그나이터3에서 이거 비슷하게 만들어 보려고 했다가 피봤지..)


즉, 컨텐츠 타입을 변경해주시면 html 한정 동작들이 전부 동작하지 않기 때문에 꼭 바꿔주셔야 합니다.

(디버그바에서도 위의 코드를 사용합니다. 저 Filters 이 아니어도, json을 호출했는데, 디버그바가 보이는 상황이 나타날 수 있습니다.)


저는 매번 저렇게 코드를 작성하는것이 귀찮(..)아서 헬퍼에 함수를 만들었습니다.


if (!function_exists('show_api')) {
/**
* show_api
*
* @param   array|object        $data
* @param   string              $type
*
* @return  bool|CodeIgniter\Format\JSONFormatter|CodeIgniter\Format\XMLFormatter
*/
function show_api ($data, string $type = 'json') {
$returnData = false;
switch ($type) {
case 'json' :
$returnData = show_json($data);
break;
case 'xml' :
$returnData = show_xml($data);
break;
}
return $returnData;
}
}
if (!function_exists('show_json')) {
/**
* show_json
*
* @param   array|object        $data
*
* @return  CodeIgniter\Format\JSONFormatter
*/
function show_json ($data) {
$format = new Config\Format();
$response = CodeIgniter\Config\Services::response();
$response->setContentType('application/json');
$formatter = $format->getFormatter('application/json');
$data = json_decode(json_encode($data), true);
return $formatter->format($data);
}
}
if (!function_exists('show_xml')) {
/**
* show_xml
*
* @param   array|object        $data
*
* @return  CodeIgniter\Format\XMLFormatter
*/
function show_xml ($data) {
$format = new Config\Format();
$response = CodeIgniter\Config\Services::response();
$response->setContentType('application/xml');
$formatter = $format->getFormatter('application/xml');
$data = json_decode(json_encode($data), true);
return $formatter->format($data);
}
}


헬퍼에 위의 함수를 넣게 되면 각 함수를 호출할때 데이터를 입력함으로서 모든 작업을 자동으로 해주게 됩니다.

(코드가 상당히 많이 간결해지죠.)


show_json(); 이라는 함수는 제가 코드이그나이터3 시절부터 사용하던 함수라서 그걸 그대로 사용했습니다.


코드이그나이터3는 show_404(); 등등의 함수가 있기 때문에 그거 비슷하게 만든 함수였..



그래서 코드이그나이터4도 show_404 함수를 직접 만들어서 사용중입니다.

(코드이그나이터4에서는 show_404() 함수가 존재하지 않더군요.)


ps. URI Routing 에서 $routes->setTranslateURIDashes(true); 라는것이 존재하는데..

현재 버전에서는 작동을 하지 않더군요.


그래서 코드를 계속 파고파고 파서 들어가보니까..

만들다가 만거 같은 느낌이 드네요..


일단 설정한 값을 중간부분까지는 사용하기는 하는거 보니까..

만들기는 한거 같은데..


어느순간부터 설정을 사용을 안하네요..

아마 이 버그는 정식버전 나오면서 패치가 되겠지요.

(정규 버전까지 수정이 안되면 이슈트래커 올려야..)


수정해보려고 했는데, 수정해야할 부분이 생각외로 많아서;;

그냥 코어팀에서 수정해주는걸 기다려야..

Posted by Pure Ani

RE:D Cherish! -Eternity Blood- CRYSTALiA

放課後シンデレラ2 HOOKSOFT

花鐘カナデ*グラム NanaWind

フタマタ恋愛 ASa Project

スタディ§ステディ2 ま~まれぇど

リンパにATATA! ~メス牡蠣ミルクどぴゅらっしゅ~ Hending

創作彼女の恋愛公式 Aino+Links

流星ワールドアクター Heliodor

Secret Agent~騎士学園の忍びなるもの~ ensemble

天冥のコンキスタ エウシュリー

HaremKingdom -ハーレムキングダム- SMEE

ラズベリーキューブ まどそふと

ノラと皇女と野良猫ハート2 -Nora, Princess, and Crying Cat.- HARUKAZE

『ノラと皇女と野良猫ハート2』応援中♪

ピュアソングガーデン PULLTOP

はにデビ! Honey&Devil eufonie

姫繰三六五 HIMEKURI365

姫繰三六五 公式ウェブサイト

はるるみなもに! クロシェット

死に逝く君、館に芽吹く憎悪 バグシステム

Sanguinea-サングイネア- すにぃる

麗華の館 しすたーそふと

カスタムメイドオンライン KISS