Laavel에서 웹 API 사용
우리는 웹 API를 통해 사내 가동 예선에서 이동하는 라벨과 클라우드에서 이동하는 라벨을 연합해 봤다.
개념도
하고 싶은 일
사내 예선 급여내역 AP 서버를 방문할 때는 클라우드 컴퓨팅의 근태타 AP 서버 데이터를 함께 확보하고, 급여내역을 결합해 근태실적 내역을 표시하고자 한다.
서열도
웹 API 설계
나는 디자인할 때 결정해야 할 항목을 열거했다.
HTTP 메서드
GET
끝점
/api/v1/kintai/{yyyyMM}/{勤怠個人番号}
기능 개요
직원의 업무 실적 데이터를 되돌려주다
청원
yyyyMM
··연월('last'로 지정되면 최종 연월)勤怠個人番号
··직원의 출근 개인번호(Active Directory 문의)호응하다
200
...성공404
...청구되지 않은 근태실적API는 일반적으로 토큰인증을 사용하지만 사내에서만 사용하기 때문에 인증 자체를 생략했다.
API 규격서의 작법은 일정한 패턴이 있다.
다른 회사 인사용역 클라우드 API의 문서 URL을 참조하십시오.
Laavel에서 설치 방법
API 호출 서버
클라우드에 배치된 API를 AP 서버라고 합니다.
먼저
api.php
에서 끝점을 정의합니다.web.php
에는 CSRF 보호가 있지만 api.php
에는 없습니다.routes/api.php
Route::get('v1/kintai/{yyyymm}/{id}', 'Api\KintaiController@index');
요청을 수락하는 컨트롤러를 만듭니다.app/Http/Controllers/Api/KintaiController.php
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Result;
use Carbon\Carbon;
use App\Http\Controllers\Controller;
/*
給与明細サーバから呼ばれるクラス
*/
class KintaiController extends Controller
{
public function index(Request $request, $yyyymm, $syaincd)
{
if ($yyyymm == 'last') { // last指定時は最終年月を仮定
$yyyymm = Carbon::yesterday()->format('Ym');
}
$baseDate = Carbon::create(substr($yyyymm, 0, 4), substr($yyyymm, 4, 2), 1); // 基準日の設定
// 勤怠実績データベースの読み込み
$query = Result::where('syaincd', $syaincd)
->whereBetween('kintaijissekiymd', array($baseDate->copy()->startOfMonth()->format('Ymd'), $baseDate->copy()->endOfMonth()->format('Ymd')))
->orderBy('kintaijissekiymd');
// レコード件数が0より大きければデータを返し、そうでなければエラーレスポンスとする
if ($query->count() > 0) {
return response()->json([
'code' => 200,
'contents' => $query->get()
], 200);
} else {
return response()->json([
'code' => 404,
'message' => 'Not Found'
], 404);
}
}
}
Eloquent 모델에서는 문자열에 할당될 때 JSON으로 변환되므로 Eloquent 객체로 직접 반환할 수 있습니다.명령에서 API 테스트
curl
명령을 사용하여 명령을 받은 JSON 데이터를 성형 확인한다.조개껍질
curl -s https://example.com/api/v1/kintai/202006/12765 | jq
파이썬의 경우import requests
res = requests.get('https://example.com/api/v1/kintai/202006/12765')
print(res.json())
결과 내보내기{
"code": 200,
"contents": [
{
"syaincd": 12765,
"syainmei": "山田 太郎",
"kanrisyouninkengencode": "一般社員",
"kintaijissekiymd": "20200625",
"syugyozikantaikaishihhmi": "0850",
"syugyozikantaisyuryohhmi": "1730",
"meisyo": "出勤",
"barcodesyukkinhhmi": "0842",
"barcodetaikinhhmi": "1738",
:
API 호출 서버
회사 내부에 놓인 API라는 AP 서버(급여명세서 서버)다.
API를 통해 얻은 데이터는 프런트엔드 Vue입니다.보통 js와 React에 렌더링을 맡기고, 여기서는 Laavel로 받아들여 시야(Blade)에 맡깁니다.
app/Http/Controllers/KintaiController.php (부분 발췌)
$context = stream_context_create(array(
'http' => array('ignore_errors' => true)
));
$kintaicd = $request->session()->get('user')->kintaicd;
// APIを呼び出す
$json = file_get_contents("https://example.com/api/v1/kintai/$yyyymm/$kintaicd", false, $context);
$ary = json_decode($json); // JSONを配列に
// 正常なら "contents" をViewに渡す
if ($ary->code == 200) {
$reports = $ary->contents;
} else {
$reports = null;
}
return view('kintai', compact('reports'))
->with('spec_type', 'kintai')
->with('ym', substr($yyyymm, 0, 4) . '年' . ltrim(substr($yyyymm, 4, 2), '0') . '月')
->with('prev_month', $dt->copy()->subMonth(1)->format('Ym'))
->with('next_month', $dt->copy()->addMonth(1)->format('Ym'));
뷰(Blade)에서 $reports를 확장합니다.resources\views\kintai.blade.php
<div class="table-responsive">
<table class="table text-nowrap table-bordered table-striped table-hover table-condensed">
<thead>
<tr>
<td rowspan="2">日付</td>
<td rowspan="2">勤怠種別</td>
<td colspan="2">打刻</td>
: 省略
</tr>
<tr>
<td>出勤</td>
<td>退勤</td>
<td>就業開始</td>
: 省略
</tr>
</thead>
<tbody>
@foreach ($reports as $report)
<tr>
<td>{{ $report->kintaijissekiymd }}</td>
<td>{{ $report->syukkinhhmi }}</td>
<td>{{ $report->taikinhhmi }}</td>
: 省略
</tr>
@endforeach
</tbody>
</table>
</div>
이상.참고가 됐으면 좋겠어요.
Reference
이 문제에 관하여(Laavel에서 웹 API 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mindwood/articles/74e954509d5a33텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)