{"id":32541,"date":"2024-11-01T09:09:51","date_gmt":"2024-11-01T09:09:51","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=32541"},"modified":"2024-11-01T11:54:53","modified_gmt":"2024-11-01T11:54:53","slug":"flutter-course-implementing-login-functionality-16-5","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/32541\/","title":{"rendered":"Flutter Course, Implementing Login Functionality 16.5"},"content":{"rendered":"<p>In this article, we will explore in detail how to implement a login feature using the Flutter framework. The login feature is a core element of the user authentication process and is essential in many applications. Properly implementing the login feature plays a significant role in enhancing user experience and strengthening security.<\/p>\n<h2>1. Overview of Flutter and Login Feature<\/h2>\n<p>Flutter is a UI toolkit developed by Google, enabling the creation of beautiful and fast applications for both iOS and Android platforms from a single codebase. In particular, Flutter&#8217;s widget-based architecture helps to easily build user interfaces and effectively improve user experiences.<\/p>\n<h2>2. Reasons for Needing a Login Feature<\/h2>\n<ul>\n<li><strong>Security:<\/strong> A login process is necessary to protect user data and prevent unauthorized access.<\/li>\n<li><strong>Personalization:<\/strong> When users log in, the user experience can be personalized, and persistent data storage becomes possible.<\/li>\n<li><strong>Data Management:<\/strong> The login feature allows administrators to efficiently collect and manage user data.<\/li>\n<\/ul>\n<h2>3. Project Setup<\/h2>\n<p>First, you need to check if the Flutter environment is installed. If the Flutter SDK is installed, you can create a new Flutter project using the command below.<\/p>\n<pre><code>flutter create login_example<\/code><\/pre>\n<p>Navigate to the project folder.<\/p>\n<pre><code>cd login_example<\/code><\/pre>\n<h2>4. Adding Required Packages<\/h2>\n<p>To implement the login feature, you need to add the <code>http<\/code> package to manage HTTP requests. Additionally, you might need the <code>provider<\/code> package for form validation. Open the <code>pubspec.yaml<\/code> file and add the packages below:<\/p>\n<pre><code>dependencies:\n  flutter:\n    sdk: flutter\n  http: ^0.13.3\n  provider: ^5.0.0<\/code><\/pre>\n<p>Run the command below to apply the changes.<\/p>\n<pre><code>flutter pub get<\/code><\/pre>\n<h2>5. Building Basic UI<\/h2>\n<p>Now, let&#8217;s build the basic UI for the login screen. Please write the following code in the <code>lib\/main.dart<\/code> file.<\/p>\n<pre><code>import 'package:flutter\/material.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Login Example',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: LoginPage(),\n    );\n  }\n}\n\nclass LoginPage extends StatefulWidget {\n  @override\n  _LoginPageState createState() => _LoginPageState();\n}\n\nclass _LoginPageState extends State<LoginPage> {\n  final TextEditingController _emailController = TextEditingController();\n  final TextEditingController _passwordController = TextEditingController();\n\n  void _login() {\n    \/\/ Login feature implementation is planned\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Login Page'),\n      ),\n      body: Padding(\n        padding: const EdgeInsets.all(16.0),\n        child: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: [\n            TextField(\n              controller: _emailController,\n              decoration: InputDecoration(\n                labelText: 'Email',\n                border: OutlineInputBorder(),\n              ),\n            ),\n            SizedBox(height: 16.0),\n            TextField(\n              controller: _passwordController,\n              decoration: InputDecoration(\n                labelText: 'Password',\n                border: OutlineInputBorder(),\n              ),\n              obscureText: true,\n            ),\n            SizedBox(height: 16.0),\n            ElevatedButton(\n              onPressed: _login,\n              child: Text('Login'),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}<\/loginpage><\/code><\/pre>\n<h2>6. Implementing Login Functionality<\/h2>\n<p>We will explore how to handle user login information in a mobile application and how to request that information from a server. Add the following code to the <code>_login<\/code> method:<\/p>\n<pre><code>import 'dart:convert';\nimport 'package:http\/http.dart' as http;\n\nvoid _login() async {\n  String email = _emailController.text;\n  String password = _passwordController.text;\n\n  \/\/ Sending POST request to the server\n  final response = await http.post(\n    Uri.parse('https:\/\/example.com\/api\/login'),\n    headers: {\n      'Content-Type': 'application\/json',\n    },\n    body: jsonEncode({\n      'email': email,\n      'password': password,\n    }),\n  );\n\n  if (response.statusCode == 200) {\n    \/\/ Login successful\n    final data = jsonDecode(response.body);\n    \/\/ Handle user information (e.g., save token)\n    print('Login successful: ${data['token']}');\n  } else {\n    \/\/ Login failed\n    print('Login failed: ${response.body}');\n  }\n}<\/code><\/pre>\n<h2>7. Error Handling and User Feedback<\/h2>\n<p>If the login fails, provide an appropriate error message to the user. You can use the <code>alert<\/code> dialog box to display an error message. You can add the following code to show a message upon login failure:<\/p>\n<pre><code>if (response.statusCode != 200) {\n  _showErrorDialog('Login failed. Please check your email or password.');\n}\n\nvoid _showErrorDialog(String message) {\n  showDialog(\n    context: context,\n    builder: (ctx) => AlertDialog(\n      title: Text('Error'),\n      content: Text(message),\n      actions: [\n        TextButton(\n          onPressed: () => Navigator.of(ctx).pop(),\n          child: Text('OK'),\n        ),\n      ],\n    ),\n  );\n}<\/code><\/pre>\n<h2>8. Adding Form Validation<\/h2>\n<p>It is advisable to add field validation to ensure that users enter valid email and password. You can validate input using Flutter&#8217;s Form and TextFormField widgets.<\/p>\n<pre><code>final _formKey = GlobalKey<FormState>();\n\n@override\nWidget build(BuildContext context) {\n  return Form(\n    key: _formKey,\n    child: Column(\n      ...\n      children: [\n        TextFormField(\n          controller: _emailController,\n          validator: (value) {\n            if (value == null || value.isEmpty) {\n              return 'Please enter your email.';\n            }\n            return null;\n          },\n          ...\n        ),\n        TextFormField(\n          controller: _passwordController,\n          validator: (value) {\n            if (value == null || value.isEmpty) {\n              return 'Please enter your password.';\n            }\n            return null;\n          },\n          ...\n        ),\n        ElevatedButton(\n          onPressed: () {\n            if (_formKey.currentState!.validate()) {\n              _login();\n            }\n          },\n          child: Text('Login'),\n        ),\n      ],\n    ),\n  );\n}<\/formstate><\/code><\/pre>\n<h2>9. Session Management<\/h2>\n<p>To manage the user&#8217;s session after login, you can store the token of the logged-in user in local storage. Using the <code>shared_preferences<\/code> package allows for easy storage. Implement session management as follows:<\/p>\n<pre><code>import 'package:shared_preferences\/shared_preferences.dart';\n\nvoid _login() async {\n  \/\/ ... existing code omitted ...\n  \n  if (response.statusCode == 200) {\n    final data = jsonDecode(response.body);\n    \/\/ Save token\n    SharedPreferences prefs = await SharedPreferences.getInstance();\n    await prefs.setString('token', data['token']);\n    print('Login successful: ${data['token']}');\n  }<\/code><\/pre>\n<h2>10. Implementing Logout Functionality<\/h2>\n<p>Add a logout feature so that users can log out. During logout, end the session and remove the stored token.<\/p>\n<pre><code>void _logout() async {\n  SharedPreferences prefs = await SharedPreferences.getInstance();\n  await prefs.remove('token');\n  print('Logged out successfully.');\n}<\/code><\/pre>\n<h2>11. Additional Security Considerations<\/h2>\n<p>When implementing the login feature, consider the following security principles:<\/p>\n<ul>\n<li><strong>HTTPS:<\/strong> Login requests should always use HTTPS protocol for encryption.<\/li>\n<li><strong>Password Storage:<\/strong> User passwords should be stored encrypted and should not be exposed directly.<\/li>\n<li><strong>Two-Factor Authentication:<\/strong> Consider implementing Two-Factor Authentication (MFA) for additional security.<\/li>\n<\/ul>\n<h2>12. Conclusion<\/h2>\n<p>In this tutorial, we explored in detail how to implement a login feature using Flutter. User authentication is an important part of applications and should be designed with security and user experience in mind. Built on the login feature, we hope to create applications that manage user data securely and efficiently.<\/p>\n<p>We will cover more Flutter-related topics in future tutorials, so please stay tuned. Thank you!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this article, we will explore in detail how to implement a login feature using the Flutter framework. The login feature is a core element of the user authentication process and is essential in many applications. Properly implementing the login feature plays a significant role in enhancing user experience and strengthening security. 1. Overview of &hellip; <a href=\"https:\/\/atmokpo.com\/w\/32541\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Flutter Course, Implementing Login Functionality 16.5&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[151],"tags":[],"class_list":["post-32541","post","type-post","status-publish","format-standard","hentry","category-flutter-course"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Flutter Course, Implementing Login Functionality 16.5 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/32541\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flutter Course, Implementing Login Functionality 16.5 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"In this article, we will explore in detail how to implement a login feature using the Flutter framework. The login feature is a core element of the user authentication process and is essential in many applications. Properly implementing the login feature plays a significant role in enhancing user experience and strengthening security. 1. Overview of &hellip; \ub354 \ubcf4\uae30 &quot;Flutter Course, Implementing Login Functionality 16.5&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/32541\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:09:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:54:53+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/32541\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32541\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Flutter Course, Implementing Login Functionality 16.5\",\"datePublished\":\"2024-11-01T09:09:51+00:00\",\"dateModified\":\"2024-11-01T11:54:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32541\/\"},\"wordCount\":531,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"Flutter course\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/32541\/\",\"url\":\"https:\/\/atmokpo.com\/w\/32541\/\",\"name\":\"Flutter Course, Implementing Login Functionality 16.5 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:09:51+00:00\",\"dateModified\":\"2024-11-01T11:54:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32541\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/32541\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/32541\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flutter Course, Implementing Login Functionality 16.5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flutter Course, Implementing Login Functionality 16.5 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/32541\/","og_locale":"ko_KR","og_type":"article","og_title":"Flutter Course, Implementing Login Functionality 16.5 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"In this article, we will explore in detail how to implement a login feature using the Flutter framework. The login feature is a core element of the user authentication process and is essential in many applications. Properly implementing the login feature plays a significant role in enhancing user experience and strengthening security. 1. Overview of &hellip; \ub354 \ubcf4\uae30 \"Flutter Course, Implementing Login Functionality 16.5\"","og_url":"https:\/\/atmokpo.com\/w\/32541\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:09:51+00:00","article_modified_time":"2024-11-01T11:54:53+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/32541\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/32541\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Flutter Course, Implementing Login Functionality 16.5","datePublished":"2024-11-01T09:09:51+00:00","dateModified":"2024-11-01T11:54:53+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/32541\/"},"wordCount":531,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["Flutter course"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/32541\/","url":"https:\/\/atmokpo.com\/w\/32541\/","name":"Flutter Course, Implementing Login Functionality 16.5 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:09:51+00:00","dateModified":"2024-11-01T11:54:53+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/32541\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/32541\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/32541\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Flutter Course, Implementing Login Functionality 16.5"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=32541"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32541\/revisions"}],"predecessor-version":[{"id":32542,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32541\/revisions\/32542"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=32541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=32541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=32541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}