Create a PHP REST API : Write a RESTful API from Scratch using Plain, Object-Oriented PHP and MySQL
HTML-код
- Опубликовано: 1 май 2024
- Learn how to develop a complete, RESTful API using plain, object-oriented PHP, MySQL and best practices.
Full API course, including authentication:
‣ davehollingworth.net/phpapisy
Please consider supporting my channel:
☕ ko-fi.com/davehollingworth
In this video you'll learn how to:
• create RESTful URLs
• list, show, create, update and delete database records using an API
• organise your PHP code
• use controllers and table gateways
• return relevant HTTP status codes
• validate data in an API
• decode and encode requests and responses as JSON
Code shown in the video:
‣ github.com/daveh/php-rest-api
Relevant documentation:
‣ curl.se/
‣ www.postman.com/
‣ httpie.io/
‣ www.php.net/manual/en/functio...
‣ www.php.net/manual/en/pdo.set...
‣ www.php.net/manual/en/class.e...
00:00 Introduction
00:18 API client
00:31 Front controller
01:38 RESTful endpoints
02:03 URL rewriting
03:03 HTTPie usage
03:28 Routing
03:59 404 response
04:23 Collection and resource URLs
05:19 Controller class
06:27 Class autoloading
08:19 Process the request
09:06 Collection requests
09:55 JSON Content-type
10:56 Create the database
11:53 Connect to the DB
14:08 Exception handling
16:44 Table gateway class
17:42 List all records
19:52 Encode JSON values
21:35 Insert a record
21:55 Get request data
27:04 201 response
28:00 Error handling
30:00 Data validation
31:46 422 response
32:28 405 response
33:36 Resource requests
34:43 Get a resource
35:59 404 response
37:02 Update a resource
40:03 Conditional validation
41:12 Delete a resource
43:12 Summary
#PHP #MySQL #REST #API - Наука
Out of interest, what data are you creating an API for?
fun pet project (10 yrs in the making! 🙃) to create a user login & personal data store for a language gaming website using vanilla js (& react) on the ft end.
Learning, I can create an API with a framework but wanted to learn doing it with plain PHP.
Personal project about tree varieties of all things.. whilst on break from MSc. This is great precursor to your Udemy course so thanks for posting!
A learning Management System. Want a flutter developer to build the mobile version using same data.
For learning. Thank you, Dave, for an amazing video.
my php back end skills are archaic ... so before I dive in any api php framework I want to learn how to do it in plain PHP ... this tutorial is a blessing for me ...
Quite simply: the best php tutorial I have seen so far! Thank you for your crystal clear explanations.
I love how clearly you explain things. Please keep posting videos cause its really straight forward and help me learn a lot.
One of the best tutorials I've seen, including paid ones. I really appreciate it and would love to see more.
hands-down one of the best coding tutorials I've seen, thank you, this helps me a lot
Dude, you must be a pro! Thanks for such a detailed description. I'm actually amazed why there are so less comments and likes. You deserves a million of likes and subscribers. Subscribed!😊
I've been searching for such amazing lesson for so long
thank you so much Dave .
Very nice and modern PHP Crash course. Absolutely awesome. Thanks 🙏
undoubtedly, one of the best PHP API instructors... full stop... subscribed
Come on Dave, I am still feeling dizzy watching this Video. How can you be so good! Simply no daylight between you and PHP ! Am in awe.
Thank you so much, Dave. Sorry for myself trying to understand what you have taught so very well
The tuitorial was perfect. Very invaluable 🏆🏆🏆
This was amazing! Keep up the amazing work!
Stunning presentation. Wow! Dave. My jaw is on the floor!
Thanks
Best PHP RESTful API Tutorial ever. Close the other tabs and stick to this one.
Thank you very much for such a great tutorial!
You explained everything very clearly, and the tutorial was easy to follow.
This is just what I need, Thank you very much.
I love how the topic is explained, very concise and straight forward.
I came from Node and Python. Your tutorial pace very well and the content was concise, gave me the confidence to build one API server with PHP todday.
Excellent Tutorial. Thanks Dave.
you're very good dave, you teach and introduce us to the new term like table gateway pattern and many more along the tutorial.. kudos
Thank you creating this wonderful video. You have helped a lot of people.
This was very helpful, thank you!
Great Tutorial, thank you very much for your time and effort!
very clear explanation, thank you!
Really good video, just the one I needed.
YOU ARE AWESOME! I now have a better understanding of APIs in PHP
Thank you so much! Greetings from Brazil!
thanks a lot! this is exactly what I was looking for, you explained everything really well, now I can go ahead and make my project
You're really the best! Thank you so much
thats it! i'm officially done w/ .net 😁 many txs dave!!!!!
This is gold... thank you so much
Thanks a lot, it was very clear.
Thanks man, so educative and clear. I am developing my first API at the middle of this video 😁
Thanks.. that was very useful.. and i aslo liked your teaching style, its wonderful.. thanks again.
Perfection i learned alott thank you❤
excelent explication video, thanks from mexico!
Great lesson, I don't normally comment but this deserves it. Thanks 📌📌📌📌📌📌✔✔✔✔✔✔👍👍
You are a great teacher!
fruitful tutorial, you are amazing
I've started working with htmx recently and like that I don't have to work with json for the most part :)
Still, this is a nice tutorial to set up a basic system to receive requests.
Excellent video, thank you.
Absolutely awesome
Thank you so much
Thank you ! Awesome
HI Dave, this video is the best restapi creation on RUclips, please do a video to secure the restapi with tokens or using jwt etc please please 🙏
Thank you very much for the Great Explained Video. If you can, please make another one by explaining how to upload an image / Document using the API
thank you
Great as ever.. May you make a tutorial about htaccess and apache server
very cool vide, thanks!
Tq. i want to be expert at Back End as no problem at Front End. Already subscribe your modul at udemy. tq
Great one ! Thanks a lot
By the way, Ibought the course on Udemy !
... it definitively worth the money !
Wow Thanks
Great
Thanks alot for your tutorial! I have a few questions. Before even creating the database in PHPmyAdmin, my HTTPie always returns ‘404 not found’ The only files i have are index.php, .htaccess and ProductController.php in a seperate src folder & when i try to create the database in PHPmyAdmin it will not create the table. I copied your code from github and do not understand what i’m doing wrong here or how to fix it.
This is great content. How do you secure it?
Using an API key is a common way (covered on the course linked to in the description)
Awesome and nicely explained tutorial, thanks Dave. by any chance can you add Authentication to this tutorial ?
It's on my list to do when I get chance, yes!
Good tutorial,
I have a question if i want to add another another model for example user so i have to create another controller and gateway for it even configure the route
Can you suggest a good architecture for it ?
I suggest using something like Slim - there's a full video on it here: ruclips.net/video/PHZtujcTRPk/видео.html
Can someone help:
I got this error when I want to post data form React fornt to PHP back:
response to preflight request doesn't pass access control check it does not have http ok status
Hi Dave.
Do you have any course about basics of this toturial? I can't undestand this toturial.
I have also learned your two MVC courses on Udemy.
Yes, there's a link at the top of the description, thank you for your interest!
The course is very useful. Thanks a lot. I have a question. If we want to create another controller, such as categories. I could not understand how we should follow the actions in Index.php. Can you show a sample code snippet to create another controller?
You'd have to create the controller class (and the gateway class if necessary) based on the URL segment, in the $parts[1] variable. A simple if-else statement would do the trick. You'd also have to modify the check for displaying a 404 status based on the URL to include another string.
Very well explained. The only thing I got a little confused with was the switch case of POST/GET, and then also PATCH and DELETE, between processResourceRequest and processCollectionRequest. These are custom request methods? I guess I have missed something...
These are custom methods, yes. Basically the switch chooses which one to run based on the HTTP request method.
@@dave-hollingworth I have figured it out, watched it all over. This was a great tutorial, I have learned a lot in just one day. Thank you.
Thanks for this brilliant class! One question: why am I getting an error when I define
array | false
in this point: public function getUsuario(string $id): array | false
?
I receive this message: syntax error, unexpected '|', expecting ';' or '{' in...
Is there any special environment to run this way?
That's a union type, which was introduced in PHP 8 - if you're getting an error, then you're using a version earlier than that. You can either upgrade to PHP 8, or remove those return type declarations.
Thank you Dave for this tutorial. How can I make a route for another table. Let say user for example. Thank
You can just create more scripts that are similar to the ones in the tutorial but for a different table, e.g. create_user.php etc.
Iras a terminar el proyecto?
those php code you wrote, are still usable nowadays or are they obsolete? nice class by the way, im a javascript/node dev, and im trying to learn php, your videos are the best i have seen so far
Thank you for your kind words! Yes, the code is still current and not obsolete
It's rare for old PHP to not work in the latest version. Backwards compatibility is generally very good.
Sorry again, Could I ask you which request software you are using in this video please ? Thank you very much, this tutorial is so well realized !
HTTPie - httpie.io/
thank
welcome
Que bueno.
Hi, Dave, could you consider helping with the expanded .htaccess rules?
Secondly, could you extend this Video to add the making of a Mobile App using PHP for Server Side scripts?
Of course, what do you want to do with the .htaccess file?
Hi and thank you so much for this!
I have one question though. I keep getting this error when trying to connect to the DB:
"syntax error, unexpected 'private' (T_PRIVATE), expecting variable (T_VARIABLE)". Can't seem to find the issue.
Do you have any idea what can it be?
Me too, did anyone else get and solve this?
Don't know why I didn't see this message earlier - what line of code is causing the error?
@@dave-hollingworth Found the problem: If you declare a __construct function with private parameters, you get the error, so the example would be in the declaration of the Database class. The reason is that this feature of allowing private parameters was only introduced in PHP v8. So anything less than this will generate the error. Now that I know this, I used the following to get the same result.
PHP < v8
private string $host;
private string $name;
private string $user;
private string $password;
public function __construct( string $akahost,
string $akaname,
string $akauser,
string $akapassword)
{
$this->host=$akahost;
$this->name=$akaname;
$this->user=$akauser;
$this->password=$akapassword;
}
PHP > v8
public function __construct(private string $host,
private string $name,
private string $user,
private string $password)
{}
very good tutorial about rest api. is there any way to provide the rewrite rules for nginx ?
You could try something like this: winginx.com/en/htaccess
Why did you choose to work in the htdocs folder directly, rather than a folder in the htdocs folder?
Just to keep it as simple as possible for the video.
In the getConnection method why do always create a new instance of a PDO?
To connect to the database - if you're calling the getConnection method more than once in a single request, then you could modify it to always return the same object
Please can you make a tutorial on the Twitter API using core PHP?
Ok will add it to my list! Thank you for the suggestion :-)
Hello Dave, 23:
Do you know why I keep getting response 403 Forbidden when I type this /products name="A new product"
Thank you
What are you using to make the request? (e.g. HTTPie, cURL)
@@dave-hollingworth I am using httpie desktop app
@@dave-hollingworth hi, it appears that I can't put the inputs in the URL, except for the id. all other fields have to be put in the body in json instead of putting it in the url.
Not sure why that's happening without being able to reproduce it, but if that works for you, no problem
I am attempting to replicate what you have done here. However the mod_rewrite is not working with the .htaccess file. I have confirmed that it is turned on in Apache using a2enmod on Linux. Any suggestions on how I can fix this ?
If you can't get mod_rewrite to work, you could just have the URL as localhost/products.php instead, without rewriting the URL
@@dave-hollingworth I am using Apache. I did figure it out. The AllowOverride directive was set to None. When configured in this manner, htaccess is useless as Apache ignores it. Had to change it to All and then the htaccess file was recognized
how do you add another route, like clients routes??
The check for the URL segment is to demonstrate returning a 404 response - to add other routes, you would change this check to include others; or if you have a lot of resources, consider using a router component or something like Slim
Dave Hollingworth can you gve me the tutoria api corse for free? i cant buy it
dave, on minute 22:22 i try the post request products name="new product" but the page return forbidden.. i change it to products name='new product' and now it return 404 not found.. is there any place that i need to check or any setting that i need to change? thanks
Are you running the code in a subfolder? If so you need to take this into account when parsing the URL for its segments
@@dave-hollingworth im using laragon and my folder structure like this dave.. www/someFolder/testApi.php
@@dave-hollingworthi completed my project by following your tutorial.. thanks man
😍😍😍😍
Unfortunately I got lost somewhere in the middle. I will finish this tutorial, but at the moment it's too complicated for me ;)
what is the difference when using core/plain PHP and Laravel to create APIs?
Laravel does a lot for you, with plain PHP you have to do it all yourself. Plain PHP is simpler though and uses less resources, but Laravel is probably faster to develop once you know the framework, so it's up to you which one you use
Is there a diff between using httpie desktop and terminal? Im using desktop version and if i try to make a POST i all time get 403 response "Forbidden
You don't have permission to access this resource." GET Works fine but POST wont work at all.. after 2 hours trying to fix i have no clue why it won't work :/
There shouldn't be a difference as far as the code on the server is concerned, no - where is the 403 error coming from, your code or is the server generating it? It could be a permissions problem if you have the script in another folder
I have similar issue right now 403 forbidden, GET work fine, have resolved the issue? if yes ,how?
hello, I don't get it... How did you manage to send body POST request trough URL without any function created ? It don't work when I type "localhost/product "a new product" ! 🤨
In what way doesn't it work? Try comparing your code to the code in the video, there's a link in the description
@@dave-hollingworth Sorry Dave, I'm new to API. And in fact, in the video, I thought at first that when you were typing into the console your POST request , that you were typing it through a navigator URL like a $_GET, but now I 've understood :)
At @22:20 I am using HTTPie web app to do the testing and when I ran POST webserver/products name="xxx" it get a 404 status response.
...
$parts = explode("/", $_SERVER['REQUEST_URI']);
if ($parts[1] != "products") {
http_response_code(404);
exit();
{
...
I examined the contents of $parts[1] and it is "products%20name=%22xxx%22" What am I doing wrong? My code worked up until this point like in the video.
It looks like there's a query string in your URL - what is the exact HTTPie command you're using?
@@dave-hollingworth POST localhost/products name="xxx"
I put in a a json echo of $parts[1], ignore all but "file" as they are hard coded.
{
"code": 404,
"message": "Not Found",
"file": "ncrs%20name=%22xxx%22",
"line": ""
}
Ya I thought the same, about the querystring. You are using the desktop version of HTTPie? I was using the web version, is there a setting somewhere to tell it to treat /products name="xxx" as a form body rather than a querysytring? I asked because I searched the UI and didn't find anything.
Regardless moving on to your online course today, great stuff.
@@DavidShaw-dc4re I'm using the command-line version of HTTPie, I haven't tried the other versions yet I'm afraid
Hello,
Can that api be used with React?
Absolutely, I don't see why not
It is possible to make an online ordering without api?, can you please make a simple online ordering system that have database and crud
Yes, you can have an online ordering system without an API - will add that to my list, thank you for the suggestion
@@dave-hollingworth thank you for considering my humble request 🤩
Hi, i want to buy this course in udemy, appears 13.99 U$S but when i go to buycharge 84 U$S, can you help me?
Try this link: www.udemy.com/course/php-apis/?couponCode=9B22746697922B9BEAFA
5 minutes in and i already learned more than from 12 hr indian courses
I have created a rest api using codeigniter 4, now the issue is, data return from api all data is in string data type, to to get data in their original datatype, like boolean value in true/false, ids in number, names in string.
If you connect using PDO, you can configure this by changing some PDO settings, details here: ruclips.net/video/X51KOJKrofU/видео.html
@@dave-hollingworth very very thanks for your reply sir, i solved this issue with entity class provided by codeigniter 4 by casting, for example in userEntity i cast columns like this, proctected $cast =['id' =>'int', 'balance'=>'float','status'=>'bool'].
Please can you make a tutorial secure php ?
Ok will consider it! Thanks for the suggestion!
Add auth etc
I have a question about insert data in API, can you help me please?
Of course - please give as much detail as you can in your question.
@@dave-hollingworth can you give contacts? maybe instagram or another social media
@@code7882 My contact details are here: davehollingworth.com/contact
How did you set up your Httpie. Mine is returning 404 everytime I request.
What URL is returning 404 for you?
@@dave-hollingworth Do i need to create a products folder?
@@matrixsr172 Depends what you're doing - why would you need a products folder?
@@dave-hollingworth i am trying to do as you did. but it's showing 404 not found. in thr first segment of thhe video
@@dave-hollingworth i used the same url that you used for url rewriting
how to deploy PHP REST API ????
You can just copy the entire codebase to a live server, it should work in exactly the same way, albeit with a different hostname
how to upload a file?
I'll look into adding a video about this - in the meantime there's a tutorial here that covers it: www.onlyxcodes.com/2021/03/php-rest-api-file-upload.html
😜
If anyone is having trouble with forbidden codes
when you try DELETE PUT PATCH then check you may need to
change the .htaccess file to
--START
RewriteEngine On
RewriteRule . index.php
Require all granted
Require all denied
--END
This was for apache 2.4.54-1 on Arch linux
class David_Golden Extends Dave_Hollingworth{
$David_Golden_Say = "Thanks Alot Dave_Hollingworth ";
public function __construct( $David_Golden_Say )
{
$this->David_Golden_Say = "Let me start by saying Thank you and by calling you a Metrix ,
because you are the best programming teacher i've ever meet on the internet,
you gat me going must especially am now confident with the PDO database connection and query stuff of a thing, I Appreciate you ";
}
echo $this->David_Golden_Say ." ". " Good Teaching Style ";
}
😁 thank you so much!