Laavel에서 웹 API 사용

28906 단어 LaravelPHPAPItech
이 문서는 다음 거울 사이트입니다.
https://qiita.com/mindwood/items/94869f35b121b188dbed
우리는 웹 API를 통해 사내 가동 예선에서 이동하는 라벨과 클라우드에서 이동하는 라벨을 연합해 봤다.

개념도



하고 싶은 일


사내 예선 급여내역 AP 서버를 방문할 때는 클라우드 컴퓨팅의 근태타 AP 서버 데이터를 함께 확보하고, 급여내역을 결합해 근태실적 내역을 표시하고자 한다.

서열도



웹 API 설계


나는 디자인할 때 결정해야 할 항목을 열거했다.

  • HTTP 메서드
    GET

  • 끝점/api/v1/kintai/{yyyyMM}/{勤怠個人番号}

  • 기능 개요
    직원의 업무 실적 데이터를 되돌려주다

  • 청원
  • yyyyMM··연월('last'로 지정되면 최종 연월)
  • 勤怠個人番号··직원의 출근 개인번호(Active Directory 문의)

  • 호응하다
  • 상태 코드
  • 200...성공
  • 404...청구되지 않은 근태실적
  • 응답 형식...JSON
  • REST API는 상태가 아니므로 인증 시 쿠키와 세션을 사용할 수 없습니다.
    API는 일반적으로 토큰인증을 사용하지만 사내에서만 사용하기 때문에 인증 자체를 생략했다.
    API 규격서의 작법은 일정한 패턴이 있다.
    다른 회사 인사용역 클라우드 API의 문서 URL을 참조하십시오.
  • 인사용역freee API~https://developer.freee.co.jp/docs/hr
  • SmartHR API ~ https://developer.smarthr.jp/api/index.html
  • 작업경비 결산 API~https://ssl.wf.jobcan.jp/api_doc
  • 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>
    
    이상.참고가 됐으면 좋겠어요.

    좋은 웹페이지 즐겨찾기