Ngày nay, Python là một trong những ngôn ngữ lập trình phổ biến và dễ tiếp cận nhất. Năm 2019, nó được xếp hạng thứ ba trong xếp hạng TIOBE. Nhiều chuyên gia cho rằng 3-4 năm nữa nó sẽ vượt C và Java để dẫn đầu bảng xếp hạng
Dựa trên điều này, sẽ không ngạc nhiên nếu bạn sử dụng Python cho dự án tương tác API tiếp theo của mình. Trong bài viết này, chúng ta sẽ nói về sự khôn ngoan của việc sử dụng API và tại sao Python sẽ giúp ích rất nhiều trong nhiệm vụ này
Duyệt qua danh sách API miễn phí tốt nhấtAPI REST là gì [từ góc độ Python]
Đầu tiên, hãy xác định một API
API [Giao diện lập trình ứng dụng] là một bộ quy tắc được chia sẻ bởi một dịch vụ cụ thể. Các quy tắc này xác định định dạng nào và bộ lệnh nào mà ứng dụng của bạn có thể truy cập vào dịch vụ, cũng như dữ liệu nào mà dịch vụ này có thể trả về trong phản hồi. API hoạt động như một lớp giữa ứng dụng của bạn và dịch vụ bên ngoài. Bạn không cần biết cấu trúc bên trong và các tính năng của dịch vụ, bạn chỉ cần gửi một lệnh đơn giản nhất định và nhận dữ liệu theo định dạng định sẵn
API REST [Chuyển trạng thái đại diện] là API sử dụng các yêu cầu HTTP để liên lạc với các dịch vụ web
Nó phải tuân thủ các ràng buộc nhất định. Dưới đây là một số trong số họ
- Kiến trúc máy khách-máy chủ – máy khách chịu trách nhiệm về giao diện người dùng và máy chủ chịu trách nhiệm về phần phụ trợ và lưu trữ dữ liệu. Máy khách và máy chủ độc lập và mỗi máy có thể được thay thế
- Không trạng thái – không có dữ liệu từ máy khách được lưu trữ ở phía máy chủ. Trạng thái phiên được lưu trữ ở phía máy khách
- Có thể lưu vào bộ đệm – khách hàng có thể lưu các phản hồi của máy chủ vào bộ đệm để cải thiện hiệu suất
Một danh sách đầy đủ các ràng buộc bạn có thể thấy
Từ phía Python, API REST có thể được xem như một nguồn dữ liệu nằm trên một địa chỉ Internet có thể được truy cập theo một cách nhất định thông qua các thư viện nhất định
Các loại yêu cầu
Các loại Yêu cầu hoặc Phương thức Yêu cầu HTTP mô tả hành động mà chúng tôi sẽ thực hiện bằng cách tham khảo API
Tổng cộng, có bốn loại hành động chính
- ĐƯỢC. truy xuất thông tin [như kết quả tìm kiếm]. Đây là loại yêu cầu phổ biến nhất. Sử dụng nó, chúng tôi có thể lấy dữ liệu mà chúng tôi quan tâm từ những dữ liệu mà API sẵn sàng chia sẻ
- BƯU KIỆN. thêm dữ liệu mới vào máy chủ. Ví dụ: sử dụng loại yêu cầu này, bạn có thể thêm một mặt hàng mới vào kho của mình
- ĐẶT. thay đổi thông tin hiện có. Ví dụ: sử dụng loại yêu cầu này, có thể thay đổi màu sắc hoặc giá trị của sản phẩm hiện có
- XÓA BỎ. xóa thông tin hiện có
điều kiện tiên quyết
Để bắt đầu làm việc với API REST thông qua Python, bạn sẽ cần kết nối thư viện để gửi yêu cầu HTTP
Sự lựa chọn của thư viện phụ thuộc vào phiên bản Python
Nếu bạn sử dụng Python 2, chúng tôi khuyên bạn nên sử dụng unirest vì tính đơn giản, tốc độ và khả năng hoạt động với các yêu cầu đồng bộ và không đồng bộ
Nếu bạn làm việc với Python 3, thì chúng tôi khuyên bạn nên dừng lựa chọn đối với các yêu cầu là tiêu chuẩn thực tế để thực hiện các yêu cầu HTTP trong Python
Hơn nữa trong hướng dẫn của chúng tôi, chúng tôi sẽ sử dụng Python 3. 6 cùng với thư viện yêu cầu. Đó là cách triển khai yêu cầu GET sẽ như thế nào khi sử dụng các yêu cầu
import requests response = requests.get['//google.com/'] print[response] >>
Yêu cầu trả về Phản hồi, một đối tượng mạnh mẽ để kiểm tra kết quả của yêu cầu. Sử dụng Phản hồi, bạn có thể kiểm tra các tiêu đề và nội dung của phản hồi, lấy từ điển có dữ liệu từ JSON trong phản hồi và cũng xác định mức độ truy cập của chúng tôi vào máy chủ bằng mã phản hồi từ nó. Trong ví dụ của chúng tôi, mã phản hồi là 200, có nghĩa là yêu cầu đã thành công. Chúng tôi sẽ nghiên cứu các mã phản hồi và giá trị của chúng chi tiết hơn một chút
Mã trạng thái
Mã trạng thái được trả về cùng với phản hồi sau mỗi cuộc gọi đến máy chủ. Họ mô tả ngắn gọn kết quả của cuộc gọi. Có một số lượng lớn mã trạng thái, chúng tôi cung cấp những mã mà bạn thường gặp nhất
- 200 – được. Yêu cầu đã thành công. Bản thân câu trả lời phụ thuộc vào phương thức được sử dụng [GET, POST, v.v. ] và đặc tả API
- 204 – Không có nội dung. Máy chủ đã xử lý yêu cầu thành công và không trả lại bất kỳ nội dung nào
- 301 – Đã di chuyển vĩnh viễn. Máy chủ phản hồi rằng trang được yêu cầu [điểm cuối] đã được chuyển đến một địa chỉ khác và chuyển hướng đến địa chỉ này
- 400 – Yêu cầu sai. Máy chủ không thể xử lý yêu cầu do lỗi phía máy khách [định dạng yêu cầu không chính xác]
- 401 – Trái phép. Xảy ra khi xác thực không thành công, do thông tin đăng nhập không chính xác hoặc thậm chí không có thông tin xác thực
- 403 – Cấm. Truy cập vào tài nguyên được chỉ định bị từ chối
- 404 không tìm thấy. Không tìm thấy tài nguyên được yêu cầu trên máy chủ
- 500 – Lỗi máy chủ nội bộ. Xảy ra khi xảy ra lỗi không xác định trên máy chủ
Thư viện yêu cầu có một số thuộc tính hữu ích để làm việc với mã trạng thái. Ví dụ: bạn có thể chỉ cần xem trạng thái của mã phản hồi bằng cách truy cập. status_code
print[response.status_code] >>> 200
Đó không phải là tất cả. Bạn có thể sử dụng thể hiện Phản hồi trong biểu thức điều kiện. Nó sẽ đánh giá là Đúng nếu mã trạng thái nằm trong khoảng từ 200 đến 400 và Sai nếu không
if response: print['Request is successful.'] else: print['Request returned an error.']
điểm cuối
Để làm việc với API REST, điều quan trọng là phải hiểu Điểm cuối là gì
Thông thường, Điểm cuối là một địa chỉ cụ thể [ví dụ: https. // thời tiết ở london. com/forecast], bằng cách đề cập đến việc bạn có quyền truy cập vào một số tính năng/dữ liệu nhất định [trong trường hợp của chúng tôi – dự báo thời tiết cho Luân Đôn]. Thông thường, tên [địa chỉ] của điểm cuối tương ứng với chức năng mà nó cung cấp
Để tìm hiểu thêm về điểm cuối, chúng ta sẽ xem xét ví dụ về API đơn giản trong dịch vụ RapidAPI. Dịch vụ này là một Trung tâm API cung cấp khả năng truy cập hàng nghìn API khác nhau. Một ưu điểm khác của RapidAPI là bạn có thể truy cập các điểm cuối và kiểm tra hoạt động của API trực tiếp trong phần của nó trong dịch vụ RapidAPI
Hãy lấy ví dụ về API Dino Ipsum. API này được sử dụng để tạo bất kỳ số lượng văn bản giữ chỗ Lorem Ipsum nào. Nó rất hữu ích khi bạn tạo nguyên mẫu hoặc thử nghiệm giao diện ứng dụng của mình và muốn điền vào đó bất kỳ nội dung ngẫu nhiên nào
Để tìm phần API Dino Ipsum, hãy nhập tên của nó vào hộp tìm kiếm trong dịch vụ RapidAPI hoặc chuyển đến danh mục “Khác” từ danh sách “Tất cả danh mục” và chọn API này từ danh sách. Dino Ipsum API thông qua RapidAPI là miễn phí, vì vậy bạn có thể nhận bao nhiêu văn bản giữ chỗ tùy thích
Khi bạn chọn Dino Ipsum API, trang đầu tiên bạn sẽ thấy là tiểu mục Điểm cuối API. Điều này bao gồm hầu hết các thông tin cần thiết để bắt đầu. Tiểu mục Điểm cuối API bao gồm điều hướng, danh sách điểm cuối [chỉ một điểm cho API này], tài liệu về điểm cuối hiện được chọn và đoạn mã [có sẵn bằng 8 ngôn ngữ lập trình khác nhau] để giúp bạn bắt đầu với mã của mình
Chúng tôi sẽ kiểm tra điểm cuối duy nhất mà API này có – danh sách khủng long, trả về một lượng văn bản giữ chỗ nhất định, tùy thuộc vào các tham số đã nhập. Hiện tại chúng tôi đang thực hành với Python, chúng tôi muốn lấy một đoạn mã Python và kiểm tra nó trong ứng dụng của chúng tôi. Điền vào các tham số bắt buộc [định dạng=văn bản, từ=10, đoạn văn=1] và đây là đoạn mã của chúng tôi
response = unirest.get["//alexnormand-dino-ipsum.p.rapidapi.com/?format=text&words=10¶graphs=1", headers={ "X-RapidAPI-Host": "alexnormand-dino-ipsum.p.rapidapi.com", "X-RapidAPI-Key": "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ]
Để sử dụng nó với Python 3. 6, chúng ta cần thay đổi unirest để yêu cầu. Vì vậy, chúng tôi nhận được một ứng dụng như vậy
import requests words = 30 paragraphs = 1 formats = 'text' response = requests.get[f"//alexnormand-dino-ipsum.p.rapidapi.com/?format={formats}&words={words}¶graphs={paragraphs}", headers={ "X-RapidAPI-Host": "alexnormand-dino-ipsum.p.rapidapi.com", "X-RapidAPI-Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] print[response.text]
Ứng dụng của chúng tôi sẽ gọi điểm cuối, được đặt tại https. // alexnormand-dino-ipsum. p. nhanh chóng. com/ và sẽ in cho chúng tôi văn bản giữ chỗ đẹp mắt này
print[response.status_code] >>> 2000Duyệt API
Nhận phản hồi JSON từ yêu cầu API
Thường thì REST API trả về một phản hồi ở định dạng JSON để dễ xử lý thêm. Thư viện yêu cầu có một tiện ích. json[] cho trường hợp này để chuyển đổi JSON thành đối tượng Python
API Dino Ipsum vốn đã quen thuộc sẽ giúp chúng tôi kiểm tra chức năng này. Chúng tôi có thể nhận được JSON từ nó trong phản hồi nếu chúng tôi chỉ định tham số format = JSON khi truy cập điểm cuối danh sách khủng long
import requests params = {"words": 10, "paragraphs": 1, "format": "json"} response = requests.get[f"//alexnormand-dino-ipsum.p.rapidapi.com/", params=params, headers={ "X-RapidAPI-Host": "alexnormand-dino-ipsum.p.rapidapi.com", "X-RapidAPI-Key": "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] print [type[response.json[]]] print[response.json[]]
>>> >>> [['Olorotitan', 'Megadactylus', 'Atlantosaurus', 'Angolatitan', 'Sinosauropteryx', 'Camptonotus', 'Protarchaeopteryx', 'Unescoceratops', 'Shanag', 'Archaeoceratops']]
Lưu ý rằng lần này chúng tôi không chỉ định các tham số truy vấn trong URL mà trong đối số params của hàm
print[response.status_code] >>> 2001. Định dạng truyền tham số như vậy thậm chí còn thích hợp hơn
Cách bắt đầu sử dụng API với Python
Đã xử lý các sắc thái khi làm việc với API trong Python, chúng ta có thể tạo hướng dẫn từng bước
1. Nhận khóa API
Khóa API [thường] là một chuỗi ký tự và số duy nhất. Để bắt đầu làm việc với hầu hết các API – bạn phải đăng ký và nhận khóa API. Bạn sẽ cần thêm khóa API vào mỗi yêu cầu để API có thể nhận dạng bạn. Lấy ví dụ về RapidAPI – bạn có thể chọn phương thức đăng ký thuận tiện cho mình. Đây có thể là tên người dùng, email và mật khẩu. Tài khoản Google, Facebook hoặc Github
2. Kiểm tra điểm cuối API với Python
Khi chúng tôi nhận được khóa API, chúng tôi có thể tham khảo các điểm cuối API [theo tài liệu] để kiểm tra xem mọi thứ có hoạt động như chúng tôi mong đợi không. Nếu chúng tôi làm việc với RapidAPI ngay sau khi đăng ký dịch vụ, chúng tôi có thể chuyển đến phần API cần thiết, đăng ký nếu cần và kiểm tra câu trả lời của các điểm cuối chúng tôi cần trực tiếp trên trang API. Tiếp theo, chúng ta có thể tạo một đoạn mã Python triển khai chức năng mà chúng ta vừa kiểm tra và nhanh chóng kiểm tra nó bằng IPython hoặc chỉ cần chèn nó vào ứng dụng Python của chúng ta
3. Tạo ứng dụng Python đầu tiên của bạn với API
Sau khi chúng tôi đã kiểm tra các điểm cuối và mọi thứ hoạt động như chúng tôi mong đợi, chúng tôi có thể bắt đầu tạo ứng dụng, bao gồm các cuộc gọi đến API cần thiết. Như chúng tôi đã đề cập, RapidAPI sẽ giúp chúng tôi ở đây. Trên trang API chúng tôi cần, chúng tôi có thể sử dụng khối Đoạn mã và lấy đoạn mã Python có quyền truy cập vào điểm cuối cần thiết. Chúng ta chỉ cần nhớ rằng nếu sử dụng Python 3, chúng ta cần thay thế thư viện đơn nhất bằng các yêu cầu trong đoạn mãBắt đầu ngay bây giờ
Ví dụ API Python. Ứng dụng xem trái đất với API của NASA
Có trong tay các tính năng mạnh mẽ của Python và quyền truy cập vào nhiều loại API, chúng ta có thể làm điều gì đó tuyệt vời, chẳng hạn như khám phá độ sâu của không gian hoặc nhìn Trái đất từ quỹ đạo để bắt đầu. Đối với những tác vụ như vậy, chúng tôi sẽ cần API của NASA, có sẵn thông qua RapidAPI
1. Nhận khóa API
API của NASA miễn phí, trong trường hợp cơ bản, nó không yêu cầu đăng ký đặc biệt. Tuy nhiên, với việc sử dụng nhiều API, bạn nên đăng ký khóa dành cho nhà phát triển của NASA. Chúng tôi sẽ không sử dụng nó nhiều, vì vậy ngay sau khi đăng ký với dịch vụ RapidAPI, chúng tôi sẽ nhận được khóa dịch vụ và điều này là đủ đối với chúng tôi. Bạn có thể đăng ký bằng cách nhấp vào nút Đăng ký trong menu RapidAPI
Như chúng tôi đã đề cập, bạn có thể đăng ký theo bất kỳ cách thuận tiện nào
2. Kiểm tra điểm cuối API với Python
Sau khi đăng ký, hãy truy cập trang API của NASA. Nhập tên của nó vào hộp tìm kiếm tại dịch vụ RapidAPI hoặc chuyển đến danh mục “Khoa học” từ danh sách “Tất cả danh mục” và chọn API này từ danh sách
Chúng tôi quan tâm đến điểm cuối
print[response.status_code] >>> 2002, cung cấp danh sách các tên ảnh Trái đất được chụp bởi máy ảnh EPIC của NASA trên tàu vũ trụ NOAA DSCOVR. Theo mặc định, nó cung cấp những bức ảnh gần đây nhất. Nếu muốn, bạn cũng có thể chỉ định ngày của ảnh trong tham số ngày. Chúng tôi cần những bức ảnh mới, vì vậy các điều kiện mặc định phù hợp với chúng tôi
Với sự trợ giúp của khối Đoạn mã, chúng tôi nhận được mã chúng tôi cần. Vì chúng tôi sử dụng Python 3, chúng tôi cần thay thế thư viện unirest trong đoạn trích bằng các yêu cầu. Vì vậy, đây là đoạn trích cuối cùng của chúng tôi
response = unirest.post["//NasaAPIdimasV1.p.rapidapi.com/getEPICEarthImagery", headers={ "X-RapidAPI-Host": "NasaAPIdimasV1.p.rapidapi.com", "X-RapidAPI-Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Content-Type": "application/x-www-form-urlencoded" } ]
Phương thức
print[response.status_code] >>> 2003 trả về một từ điển Python với danh sách tên và thuộc tính của ảnh. Rõ ràng, mọi thứ hoạt động tốt và chúng ta có thể bắt đầu viết ứng dụng của mình
Tạo ứng dụng đầu tiên của bạn với API
Với sự trợ giúp của dữ liệu với hình ảnh Trái đất, chúng ta có thể tạo ứng dụng nhỏ của riêng mình để tạo ra hình ảnh động về Trái đất dựa trên những bức ảnh mới nhất của NASA
Chúng tôi sẽ cần thư viện skigage để thay đổi kích thước hình ảnh, cũng như imageio để tạo một gif động duy nhất dựa trên lựa chọn hình ảnh. Chúng ta có thể cài đặt chúng bằng lệnh
pip3 install scikit-image imageio
Chúng tôi cũng sẽ cần thư viện regex để tạo các biến riêng biệt với thông tin về năm, tháng, ngày của ảnh từ chuỗi ngày đầy đủ. Chúng tôi sẽ cần các biến này để tạo thành url của ảnh Trái đất ở định dạng.
print[response.status_code] >>> 2004
Kết quả là, chúng tôi nhận được ứng dụng sau
import requests import re import imageio from skimage import transform,io # get json with information [including name and date] about Earth pictures response = requests.post["//NasaAPIdimasV1.p.rapidapi.com/getEPICEarthImagery", headers={ "X-RapidAPI-Host": "NasaAPIdimasV1.p.rapidapi.com", "X-RapidAPI-Key": "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Content-Type": "application/x-www-form-urlencoded" } ] # convert json to Python object data = response.json[] # create regex pattern to get separately year, month and day of an image dates_pattern = r"^[?Pd{4}]-[?Pd{2}]-[?Pd{2}]" # download images and save each to ./images folder for img in data['contextWrites']['to']: # get year, month and day with regex to create image url matches = re.search[dates_pattern, img['date']] year = matches.group['year'] month = matches.group['month'] day = matches.group['day'] image_name = img['image'] img_url = f'//epic.gsfc.nasa.gov/archive/natural/{year}/{month}/{day}/png/{image_name}.png' # save image to ./images folder img_data = requests.get[img_url].content with open[f'images/{image_name}.png', 'wb'] as handler: handler.write[img_data] index = range[len[data['contextWrites']['to']]] images = [] # resize images and create gif from them for i in index: img_name = data["contextWrites"]["to"][i]["image"] img = io.imread[f'images/{img_name}.png'] small_img = transform.resize[img, [500, 500], mode='symmetric', preserve_range=True] images.append[small_img] imageio.mimsave['images/earth500.gif', images]
Chúng tôi đã thu được một hình ảnh như vậy của Trái đất từ quỹ đạo. Một điểm khởi đầu tốt để khám phá không gian xa hơn
Duyệt qua danh sách API miễn phí tốt nhất
Phần kết luận
Trong bài viết này, chúng tôi đã bắt đầu sử dụng API REST trong Python và thực hiện nhất quán tất cả các bước cần thiết để tạo một ứng dụng Python sử dụng cơ hội gần như vô hạn của API