API Calls from Next.js
Making authenticated API calls from Next.js to AuthScape backend.
AuthScape provides the apiService helper for making authenticated API calls from your Next.js frontend.
Setup
Import from the authscape package:
javascript
import { apiService } from 'authscape';
Response Structure
All API responses return an Axios response object:
response.status- HTTP status code (200, 201, 400, etc.)response.data- The actual data from the server
Always check status and access data through response.data:
javascript
let response = await apiService().get("/Users/GetAll");if (response != null && response.status == 200) {const users = response.data;setUsers(users);}
GET Requests
javascript
// Simple GETlet response = await apiService().get('/Users/GetAllUsers');if (response != null && response.status == 200) {const users = response.data;setUsers(users);}// With query parameterslet response = await apiService().get(`/Users/GetUser?id=${userId}`);if (response != null && response.status == 200) {const user = response.data;setUser(user);}// Multiple query parameterslet response = await apiService().get('/Users/Search?query=john&role=admin');if (response != null && response.status == 200) {const results = response.data;setSearchResults(results);}
POST Requests
javascript
// Create resourcelet response = await apiService().post('/Users/Create', {email: 'user@example.com',firstName: 'John',lastName: 'Doe'});if (response != null && response.status == 200) {const newUser = response.data;notification("User created with ID: " + newUser.id);}// With pagination (server-side)let response = await apiService().post('/Users/GetAllUsers', {offset: 0,length: 25,sortBy: 'email',sortDirection: 'asc'});if (response != null && response.status == 200) {setUsers(response.data.data);setRowCount(response.data.recordsTotal);}
PUT Requests
javascript
let response = await apiService().put('/Users/Update', {id: userId,firstName: 'Jane',lastName: 'Smith'});if (response != null && response.status == 200) {notification("User updated successfully");// Optionally refresh dataawait loadUsers();}
DELETE Requests
javascript
let response = await apiService().delete(`/Users/Delete?id=${userId}`);if (response != null && response.status == 200) {notification("User deleted");// Remove from local statesetUsers(prev => prev.filter(u => u.id !== userId));}
File Upload
javascript
const formData = new FormData();formData.append('file', file);let response = await apiService().post('/Files/Upload', formData, {headers: { 'Content-Type': 'multipart/form-data' }});if (response != null && response.status == 200) {const uploadedFile = response.data;console.log("File URL:", uploadedFile.uri);}
Complete Component Example
javascript
import { useState, useEffect } from 'react';import { apiService } from 'authscape';function UserList() {const [users, setUsers] = useState([]);const [loading, setLoading] = useState(true);const [error, setError] = useState(null);useEffect(() => {loadUsers();}, []);const loadUsers = async () => {setLoading(true);setError(null);try {let response = await apiService().get('/Users/GetAllUsers');if (response != null && response.status == 200) {setUsers(response.data);}} catch (err) {setError(err.message);} finally {setLoading(false);}};const deleteUser = async (userId) => {let response = await apiService().delete(`/Users/Delete?id=${userId}`);if (response != null && response.status == 200) {// Remove from local statesetUsers(prev => prev.filter(u => u.id !== userId));}};if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error}</div>;return (<ul>{users.map(user => (<li key={user.id}>{user.email}<button onClick={() => deleteUser(user.id)}>Delete</button></li>))}</ul>);}
DataGrid with Server-Side Pagination
javascript
import { useState, useEffect } from 'react';import { apiService } from 'authscape';import { DataGrid } from '@mui/x-data-grid';function UserDataGrid() {const [users, setUsers] = useState([]);const [rowCount, setRowCount] = useState(0);const [loading, setLoading] = useState(false);const [paginationModel, setPaginationModel] = useState({page: 0,pageSize: 25});useEffect(() => {loadUsers();}, [paginationModel]);const loadUsers = async () => {setLoading(true);let response = await apiService().post('/Users/GetAllUsers', {offset: paginationModel.page * paginationModel.pageSize,length: paginationModel.pageSize});if (response != null && response.status == 200) {setUsers(response.data.data);setRowCount(response.data.recordsTotal);}setLoading(false);};const columns = [{ field: 'id', headerName: 'ID', width: 90 },{ field: 'email', headerName: 'Email', width: 250 },{ field: 'firstName', headerName: 'First Name', width: 150 },{ field: 'lastName', headerName: 'Last Name', width: 150 }];return (<DataGridrows={users}columns={columns}rowCount={rowCount}loading={loading}paginationModel={paginationModel}onPaginationModelChange={setPaginationModel}paginationMode="server"pageSizeOptions={[10, 25, 50, 100]}/>);}
Error Handling
javascript
import { apiService, authService } from 'authscape';const loadData = async () => {try {let response = await apiService().get('/api/endpoint');if (response != null && response.status == 200) {return response.data;}} catch (error) {if (error.response?.status === 401) {// Unauthorized - redirect to loginauthService().login();} else if (error.response?.status === 403) {// Forbidden - show access deniednotification('Access denied');} else {notification('Error: ' + error.message);}}};
Custom Headers
javascript
let response = await apiService().get('/api/endpoint', {headers: {'X-Custom-Header': 'value','Accept-Language': 'en-US'}});if (response != null && response.status == 200) {const data = response.data;}