Cách xử lý các yêu cầu GET và POST HTTP trong Google Apps Script

Cách xử lý các yêu cầu GET và POST HTTP trong Google Apps Script

Với Google Apps Script, bạn có thể dễ dàng tạo ứng dụng web phục vụ HTML, JSON, XML hoặc đầu ra văn bản thuần bằng dịch vụ HTML. Khi bạn xuất bản dự án Google Script của bạn dưới dạng một ứng dụng web, tập lệnh sẽ nhận được một URL công khai (nghĩ API) có thể được gọi từ các ứng dụng bên ngoài bằng cách sử dụng các yêu cầu HTTP GET hoặc POST với các tham số truy vấn và thân yêu cầu.
Khi xuất bản tập lệnh dưới dạng một ứng dụng web, hãy đảm bảo chọn Allow anonymous access vào nhóm và tự thực hiện tập lệnh. Nếu bạn chỉnh sửa tập lệnh, hãy tạo một phiên bản mới bên trong trình chỉnh sửa tập lệnh và triển khai phiên bản mới nhất.
Dưới đây là một số ví dụ minh họa cách bạn có thể chuyển đổi Google Script của mình thành API web bằng cách thêm doGet và doPos tcác phương thức vào dự án của bạn.

Xử lý các yêu cầu GET

Khi tập lệnh được xuất bản dưới dạng ứng dụng web, doGet gọi lại sẽ xử lý tất cả các yêu cầu GET được thực hiện đối với URL công khai của tập lệnh. Google Script có thể trả về nội dung văn bản, dữ liệu HTML hoặc JSON đơn giản như được hiển thị trong các ví dụ bên dưới:

Trả về nội dung văn bản

const doGet = (event = {}) => {
const { parameter } = event;
const { name = 'Anonymous', country = 'Unknown' } = parameter;
const output = `Hello ${name} from ${country}`;
return ContentService.createTextOutput(output);
};
Bất kỳ tham số truy vấn nào được thêm vào URL Google Script, như tên và quốc gia trong ví dụ của chúng tôi, sẽ có sẵn trong parameter thuộc tính của event đối tượng của các phương thức doGet và doPost trong Script Script
 
https://script.google.com/macros/s/12345/exec?name=Amit&country=India
Nếu một cái gì đó không hoạt động, bạn luôn có thể đăng nhập đối tượng yêu cầu vào nhật ký bảng điều khiển StackDrive và dễ dàng gỡ lỗi yêu cầu đầy đủ.
 
console.log(`doGet`, JSON.stringify(event));

Phục vụ JSON Output

Có thể sử dụng cùng một ContentService để trả về đầu ra JSON bằng cách sử dụng setMimeType phương thức với mime được đặt là ContentService.MimeType.JSON.

const doGet = (event = {}) => {
const { parameter } = event;
const { name = 'Anonymous', country = 'Unknown' } = parameter;
const message = `Hello ${name} from ${country}`;
const json = { name, country, message };
return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(
ContentService.MimeType.JSON
);
};

Khi kiểm tra các yêu cầu HTTP trong Google Script với các tiện ích như CURL hoặc Postman, hãy đảm bảo rằng, Automatically follow redirects Follow HTTP 3xx responses as redirects cài đặt trên mạng được bật do ContentService phục vụ chuyển hướng 301 từ script.googleusercontent.com

Phục vụ nội dung HTML

Dự án tập lệnh Google Apps của bạn có thể phục vụ các trang web HTML với HtmlService. Các trang web được phân phát với App Script bao gồm tiêu đề cảnh báo của Google ở trên cùng nhưng nó có thể bị xóa nếu bạn nhúng Google Script vào một trang web khác (như Google Site) bằng thẻ IFRAME.

const doGet = (event = {}) => {
const { parameter } = event;
const { name = 'Anonymous', color = 'Black' } = parameter;
const html = `<p><b>${name}'s</b> favorite color is <font color="${color}">${color}</font></p>`;
return HtmlService.createHtmlOutput(html)
.setTitle('Apps Script Webpage')
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
};

Bạn nên đặt X-Frame-Options tiêu đề của trang web XFrameOptionsMode.ALLOWALL để cho phép các trang khác nhúng trang Google Script HTML của bạn.

Xử lý các yêu cầu POST với Google Script

Hàm gọi lại doPost được gọi khi yêu cầu POST HTTP được thực hiện đối với URL Google Script của bạn được xuất bản dưới dạng một ứng dụng web có quyền truy cập ẩn danh.

const doPost = (request) => {
console.log(request);
return ContentService.crateTextOutput(JSON.stringify(request));
};

Đối request của phương thức doPost có thể bao gồm:
  1. queryString - Các cặp tên-giá trị được gửi trong URL của yêu cầu (name = Mike & age = 12)
  2. parameter - Các cặp tên-giá trị chuỗi truy vấn cũng có thể truy cập được bên trong đối tượng tham số tương tự như các yêu cầu GET (e.paremeter.name hoặc e.parameter.age).
  3. postData- Thuộc tính nội dung của đối tượng postData bao gồm phần POST và thuộc tính type của postData chỉ định loại MIME của phần thân bài. Nó có thể có các giá trị như application/x-www-form-urlencoded(các cặp giá trị khóa được phân tách bằng ký tự '&' và mỗi khóa được phân tách khỏi giá trị được mã hóa của nó bằng '='), application/jsoncho dữ liệu JSON hoặc text/plaincho thân văn bản.
Đối với dữ liệu nhị phân, yêu cầu bài đăng HTTP được gửi với multipart/form-data loại mime. Trong trường hợp application/x-www-form-urlencoded, queryString được đặt là một phần của phần thân yêu cầu POST.

const doPost = (request = {}) => {
const { parameter, postData: { contents, type } = {} } = request;
const { source } = parameter;
if (type === 'application/json') {
const jsonData = JSON.parse(contents);
return ContentService.createTextOutput(JSON.stringify(jsonData));
}
if (type === 'application/x-www-form-urlencoded') {
const json = {};
contents
.split('&')
.map((input) => input.split('='))
.forEach(([key, value]) => {
json[decodeURIComponent(key)] = decodeURIComponent(value);
});
return ContentService.createTextOutput(JSON.stringify(json));
}
return ContentService.createTextOutput(contents);
};

Kiểm tra các yêu cầu HTTP bằng tập lệnh Google

Bạn có thể sử dụng Postman, RequestBin, CURL hoặc bất kỳ công cụ phát triển yêu thích nào của bạn để gửi các yêu cầu GET và POST đến dịch vụ Script Script của bạn. Chúng tôi sẽ sử dụng chính Script Script với dịch vụ UrlFetchApp tích hợp để kiểm tra yêu cầu và phản hồi.

Làm việc với các yêu cầu HTTP GET

Trong ví dụ này, API GET bao trùm chuỗi truy vấn thành JSON. Hàm kiểm tra makeHttpGetRequest so sánh giá trị chuỗi truy vấn được cung cấp với đối tượng được trả về.

const doGet = (event = {}) => {
const { parameter } = event;
const { name, country } = parameter;
return ContentService.createTextOutput(
JSON.stringify({ name, country })
).setMimeType(ContentService.MimeType.JSON);
};
const makeHttpGetRequest = () => {
const queryString = '?name=Amit+Agarwal&country=India';
const apiUrl = ScriptApp.getService().getUrl();
const url = apiUrl + queryString;
const options = {
method: 'GET',
followRedirects: true,
muteHttpExceptions: true,
contentType: 'application/json',
};
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() == 200) {
const { country } = JSON.parse(response);
Logger.log('Country', country);
}
};

Làm việc với các yêu cầu HTTP POST

Phương thức doPost trả về quốc gia hoặc tên từ thân yêu cầu tùy thuộc vào tham số hành động của URL tập lệnh.

const doPost = (request = {}) => {
const { parameter, postData: { contents, type } = {} } = request;
const { name, country } = JSON.parse(contents);
if (parameter.action === 'getCountry') {
return ContentService.createTextOutput(country);
} else {
return ContentService.createTextOutput(name);
}
};
const makeHttpPostRequest = () => {
const url = ScriptApp.getService().getUrl() + '?action=getCountrdy';
const payload = {
name: 'Amit Agarwal',
blog: 'www.labnol.org',
country: 'India',
};
const options = {
method: 'POST',
followRedirects: true,
muteHttpExceptions: true,
payload: JSON.stringify(payload),
};
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() == 200) {
Logger.log(response.getContentText());
}
};

Yêu cầu POST với biểu mẫu HTML

Ví dụ tiếp theo sử dụng một biểu mẫu HTML đơn giản gửi yêu cầu POST với application/x-www-form-urlencodedloại mime.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
</head>
<body>
<form
action="https://script.google.com/macros/s/#####/exec"
method="POST"
target="_blank"
>
<input type="text" name="name" />
<input type="text" name="country" />
<button type="submit">Submit</button>
</form>
</body>
</html>

Phương thức POST trả về phần POST của yêu cầu.

const doPost = (request = {}) => {
const { postData: { contents, type } = {} } = request;
return ContentService.createTextOutput(contents);
};

Sử dụng CURL để thực hiện các yêu cầu HTTP API POST trả về một tham số từ chuỗi truy vấn của URL và tên từ thân yêu cầu.

const doPost = (request = {}) => {
const { parameter, postData: { contents, type } = {} } = request;
const data = JSON.parse(contents);
return ContentService.createTextOutput(parameter.secret + type + data.name);
};

Bạn có thể sử dụng CURL để tạo yêu cầu POST cho Google Script. Hãy nhớ thêm cờ -L để cuộn tròn theo chuyển hướng từ script.google.com đến googleusercontent.com

curl -L \
-H 'Content-Type:application/json' \
-d '{"name": "Amit","country": "India"}' \
"https://script.google.com/macros/s/###/exec?secret=1234"

Bạn có thể thích những bài đăng này