Menulis fungsi HTTP
Di Cloud Run Functions, Anda menggunakan fungsi HTTP saat ingin memanggil fungsi melalui permintaan HTTP(S). Untuk memungkinkan semantik HTTP, tanda tangan fungsi HTTP menerima argumen khusus HTTP.
Penerapan
Contoh berikut menunjukkan file sumber fungsi HTTP dasar untuk setiap runtime. Lihat Struktur direktori sumber untuk mengetahui informasi tentang lokasi kode sumber.
Node.js
const functions = require('@google-cloud/functions-framework');
// Register an HTTP function with the Functions Framework
functions.http('myHttpFunction', (req, res) => {
// Your code here
// Send an HTTP response
res.send('OK');
});
Di Node.js, Anda mendaftarkan fungsi handler HTTP dengan Functions Framework untuk Node.js. Fungsi handler HTTP Anda harus berupa fungsi middleware Express yang menerima argumen permintaan dan respons serta mengirim respons HTTP.
Cloud Run Functions secara otomatis mengurai isi permintaan untuk Anda berdasarkan
header Content-Type permintaan menggunakan
body-parser,
sehingga Anda dapat mengakses objek req.body dan req.rawBody di handler HTTP Anda.
Titik entri fungsi
adalah nama yang digunakan handler untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik entrinya adalah myHttpFunction.
Python
import functions_framework
# Register an HTTP function with the Functions Framework
@functions_framework.http
def my_http_function(request):
# Your code here
# Return an HTTP response
return 'OK'
Di Python, Anda mendaftarkan fungsi handler HTTP dengan Functions Framework untuk Python. Fungsi handler HTTP harus menerima objek permintaan Flask sebagai argumen dan menampilkan nilai yang dapat dikonversi Flask menjadi objek respons HTTP.
Titik entri fungsi
adalah nama yang digunakan handler untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik entrinya adalah my_http_function.
Go
package myhttpfunction
import (
"fmt"
"net/http"
"github.com/GoogleCloudPlatform/functions-framework-go/functions"
)
func init() {
// Register an HTTP function with the Functions Framework
functions.HTTP("MyHTTPFunction", myHTTPFunction)
}
// Function myHTTPFunction is an HTTP handler
func myHTTPFunction(w http.ResponseWriter, r *http.Request) {
// Your code here
// Send an HTTP response
fmt.Fprintln(w, "OK")
}
Di Go, Anda mendaftarkan fungsi handler HTTP dengan
Functions Framework untuk Go
dalam fungsi init(). Fungsi handler HTTP Anda harus menggunakan antarmuka
http.HandlerFunc
standar untuk mengirim respons HTTP.
Titik entri fungsi
adalah nama yang digunakan handler untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik entrinya adalah MyHTTPFunction.
Fungsi handler HTTP Anda harus mengimplementasikan antarmuka
http.HandlerFunc
standar. Fungsi ini menerima antarmuka http.ResponseWriter yang digunakan fungsi Anda untuk
membuat balasan terhadap permintaan, dan pointer ke struct http.Request yang berisi detail
permintaan HTTP masuk.
Java
package myhttpfunction;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
// Define a class that implements the HttpFunction interface
public class MyHttpFunction implements HttpFunction {
// Implement the service() method to handle HTTP requests
@Override
public void service(HttpRequest request, HttpResponse response) throws Exception {
// Your code here
// Send an HTTP response
response.getWriter().write("OK");
}
}
Di Java, Anda menggunakan
Functions Framework Java API
untuk mengimplementasikan class handler HTTP dengan
antarmuka
HttpFunction. Metode service() harus mengirimkan respons HTTP.
Titik entri fungsi
adalah nama yang sepenuhnya memenuhi syarat dari class handler HTTP, termasuk nama
paket. Dalam contoh ini, titik entrinya adalah myhttpfunction.MyHttpFunction.
Metode service Anda menerima objek HttpRequest
yang menjelaskan permintaan HTTP masuk, dan objek HttpResponse
yang diisi fungsi Anda dengan pesan respons.
C#
using Google.Cloud.Functions.Framework;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MyProject
{
// Define a class that implements the IHttpFunction interface
public class MyHttpFunction : IHttpFunction
{
// Implement the HandleAsync() method to handle HTTP requests
public async Task HandleAsync(HttpContext context)
{
// Your code here
// Send an HTTP response
await context.Response.WriteAsync("OK");
}
}
}
Di runtime .NET, Anda menggunakan
Functions Framework untuk .NET
untuk mengimplementasikan class handler HTTP dengan antarmuka
IHttpFunction. Metode HandleAsync() menerima objek
HttpContext ASP.NET standar sebagai argumen dan harus mengirim respons HTTP.
Titik entri fungsi
adalah nama yang sepenuhnya memenuhi syarat dari class handler HTTP, termasuk namespace.
Dalam contoh ini, titik entrinya adalah MyProject.MyHttpFunction.
Ruby
require "functions_framework"
# Register an HTTP function with the Functions Framework
FunctionsFramework.http "my_http_function" do |request|
# Your code here
# Return an HTTP response
"OK"
end
Di Ruby, Anda mendaftarkan fungsi handler HTTP dengan Functions Framework untuk Ruby. Fungsi handler HTTP Anda harus menerima objek Permintaan Rack sebagai argumen dan menampilkan nilai yang dapat digunakan sebagai respons HTTP.
Titik entri fungsi
adalah nama yang digunakan handler untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik entrinya adalah my_http_function.
PHP
<?php
use Google\CloudFunctions\FunctionsFramework;
use Psr\Http\Message\ServerRequestInterface;
// Register an HTTP function with the Functions Framework
FunctionsFramework::http('myHttpFunction', 'myHttpHandler');
// Define your HTTP handler
function myHttpHandler(ServerRequestInterface $request): string
{
// Your code here
// Return an HTTP response
return 'OK';
}
Di PHP, Anda mendaftarkan fungsi handler HTTP dengan
Functions Framework untuk PHP.
Fungsi handler HTTP Anda harus menerima argumen yang menerapkan antarmuka
ServerRequestInterface
PSR-7, dan harus menampilkan respons HTTP sebagai string atau objek yang
mengimplementasikan antarmuka
ResponseInterface
PSR-7.
Titik entri fungsi
adalah nama yang digunakan handler untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik entrinya adalah myHttpFunction.
Permintaan dan respons HTTP
Fungsi HTTP menerima metode permintaan HTTP yang tercantum di halaman pemicu HTTP. Handler HTTP Anda dapat memeriksa metode permintaan dan menjalankan berbagai tindakan berdasarkan metode tersebut.
Fungsi Anda harus mengirimkan respons HTTP. Jika fungsi membuat tugas latar belakang
(seperti pada thread, future, objek Promise JavaScript, callback,
atau proses sistem), Anda harus menghentikan atau menyelesaikan tugas ini sebelum
mengirimkan respons HTTP. Setiap tugas yang tidak dihentikan sebelum respons HTTP
dikirim mungkin tidak akan diselesaikan, dan dapat menyebabkan perilaku yang tidak ditentukan.
Baca artikel Pemicu HTTP untuk mengetahui informasi lebih lanjut mengenai fungsi HTTP dan opsi terkait.
Menangani CORS
Cross-Origin Resource Sharing (CORS) adalah cara untuk memungkinkan aplikasi yang berjalan di satu domain mengakses resource dari domain lain. Misalnya, Anda mungkin perlu mengizinkan domain Anda membuat permintaan ke domain Cloud Run Functions untuk mengakses fungsi Anda.
Jika CORS tidak disiapkan dengan benar, Anda mungkin melihat error seperti berikut:
XMLHttpRequest cannot load https://YOUR_FUNCTION_URL. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://YOUR_DOMAIN' is therefore not allowed access.
Untuk mengizinkan permintaan lintas origin ke fungsi Anda, tetapkan header
Access-Control-Allow-Origin
yang sesuai pada respons HTTP Anda. Untuk
permintaan lintas origin preflight,
Anda harus merespons permintaan OPTIONS preflight dengan kode respons 204
dan header tambahan.
Node.js
Python
Go
Java
C#
using Google.Cloud.Functions.Framework; using Microsoft.AspNetCore.Http; using System.Net; using System.Threading.Tasks; namespace Cors; // For more information about CORS and CORS preflight requests, see // https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request. public class Function : IHttpFunction { public async Task HandleAsync(HttpContext context) { HttpRequest request = context.Request; HttpResponse response = context.Response; // Set CORS headers // Allows GETs from any origin with the Content-Type // header and caches preflight response for 3600s response.Headers.Append("Access-Control-Allow-Origin", "*"); if (HttpMethods.IsOptions(request.Method)) { response.Headers.Append("Access-Control-Allow-Methods", "GET"); response.Headers.Append("Access-Control-Allow-Headers", "Content-Type"); response.Headers.Append("Access-Control-Max-Age", "3600"); response.StatusCode = (int) HttpStatusCode.NoContent; return; } await response.WriteAsync("CORS headers set successfully!", context.RequestAborted); } }
Ruby
PHP
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use GuzzleHttp\Psr7\Response; function corsEnabledFunction(ServerRequestInterface $request): ResponseInterface { // Set CORS headers for preflight requests // Allows GETs from any origin with the Content-Type header // and caches preflight response for 3600s $headers = ['Access-Control-Allow-Origin' => '*']; if ($request->getMethod() === 'OPTIONS') { // Send response to OPTIONS requests $headers = array_merge($headers, [ 'Access-Control-Allow-Methods' => 'GET', 'Access-Control-Allow-Headers' => 'Content-Type', 'Access-Control-Max-Age' => '3600' ]); return new Response(204, $headers, ''); } else { return new Response(200, $headers, 'Hello World!'); } }
Batasan CORS
Untuk permintaan lintas origin preflight, permintaan OPTIONS preflight dikirim
tanpa header Authorization, sehingga akan ditolak pada semua fungsi HTTP
yang memerlukan autentikasi. Karena permintaan preflight gagal,
permintaan utama juga akan gagal. Untuk mengatasi keterbatasan ini, gunakan salah satu
opsi berikut:
- Mengizinkan pemanggilan yang tidak diautentikasi untuk fungsi Anda.
- Menghosting aplikasi web dan fungsi Cloud Run Anda di domain yang sama untuk menghindari CORS. Anda dapat melakukannya dengan mengintegrasikan Firebase Hosting dengan Cloud Run Functions.
Langkah berikutnya
- Pelajari lebih lanjut pemicu HTTP.
- Pelajari cara men-deploy fungsi Cloud Run.