Menulis fungsi HTTP
Di fungsi Cloud Run, 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 pengendali HTTP dengan Functions Framework untuk Node.js. Fungsi pengendali HTTP Anda harus berupa fungsi middleware Express yang menerima argumen permintaan dan respons serta mengirim respons HTTP.
Fungsi Cloud Run 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 pengendali HTTP Anda.
Titik entri fungsi adalah nama yang digunakan pengendali untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik masuknya 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 pengendali HTTP dengan Functions Framework untuk Python. Fungsi pengendali 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 pengendali untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik masuknya 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 pengendali HTTP dengan Functions Framework untuk Go dalam fungsi init()
. Fungsi pengendali HTTP Anda harus menggunakan antarmuka http.HandlerFunc
standar untuk mengirim respons HTTP.
Titik entri fungsi adalah nama yang digunakan pengendali untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik masuknya adalah MyHTTPFunction
.
Fungsi pengendali HTTP Anda harus mengimplementasikan antarmuka http.HandlerFunc
standar. Fungsi ini menerima antarmuka http.ResponseWriter yang digunakan fungsi Anda untuk membuat balasan atas 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 pengendali HTTP dengan antarmuka HttpFunction
. Metode service()
harus mengirimkan respons HTTP.
Titik entri fungsi adalah nama yang sepenuhnya memenuhi syarat dari class pengendali HTTP, termasuk nama paket. Dalam contoh ini, titik masuknya 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");
}
}
}
Pada runtime .NET, Anda menggunakan classFramework Functions untuk .NET
untuk mengimplementasikan class pengendali 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 pengendali HTTP, termasuk namespace.
Dalam contoh ini, titik masuknya 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 pengendali HTTP dengan Functions Framework untuk Ruby. Fungsi pengendali 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 pengendali untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik masuknya 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 pengendali HTTP dengan Functions Framework untuk PHP.
Fungsi pengendali 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 pengendali untuk mendaftar pada Functions Framework.
Dalam contoh ini, titik masuknya adalah myHttpFunction
.
Permintaan dan respons HTTP
Fungsi HTTP menerima metode permintaan HTTP yang tercantum di halaman pemicu HTTP. Pengendali 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 fungsi Cloud Run 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 asal ke fungsi Anda, tetapkan header Access-Control-Allow-Origin
yang sesuai pada respons HTTP Anda. Untuk permintaan lintas asal yang telah diproses sebelumnya, Anda harus merespons permintaan OPTIONS
preflight dengan kode respons 204
dan header tambahan.
Node.js
Python
Go
Java
C#
Ruby
PHP
Batasan CORS
Untuk permintaan lintas asal yang di-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.
- Hosting aplikasi web dan fungsi Cloud Run Anda di domain yang sama untuk menghindari CORS. Anda dapat melakukannya dengan mengintegrasikan Firebase Hosting dengan fungsi Cloud Run.
Langkah berikutnya
- Pelajari pemicu HTTP lebih lanjut.
- Pelajari cara men-deploy fungsi Cloud Run.
- Lihat tutorial fungsi HTTP untuk mengetahui contoh penulisan, deployment, dan pemanggilan fungsi HTTP.