Menulis fungsi HTTP
Dalam 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 ekspres yang menerima 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 Anda harus menerima Permintaan Flask sebagai argumen dan kembalikan 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
Framework Fungsi untuk Go
dalam fungsi init()
. Fungsi pengendali HTTP Anda harus menggunakan
http.HandlerFunc
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 menerapkan
http.HandlerFunc
dalam antarmuka berbasis web
yang sederhana. Fungsi ini menerima antarmuka http.ResponseWriter yang digunakan fungsi Anda untuk
membuat balasan untuk 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 metode
Functions Framework Java API
untuk menerapkan class pengendali HTTP dengan
HttpFunction
dalam antarmuka berbasis web
yang sederhana. 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 HttpRequest
objek yang menjelaskan permintaan HTTP masuk, dan HttpResponse
yang diisi oleh 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
Functions Framework untuk .NET
untuk menerapkan class pengendali HTTP dengan
IHttpFunction
dalam antarmuka berbasis web
yang sederhana. Metode HandleAsync()
menerima ASP.NET standar
Objek HttpContext
sebagai argumen dan harus mengirimkan 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 Permintaan Rak sebagai argumen dan kembalikan 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 PSR-7
ServerRequestInterface
dan harus mengembalikan respons HTTP sebagai string atau objek yang
mengimplementasikan PSR-7
ResponseInterface
dalam antarmuka berbasis web
yang sederhana.
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 membiarkan aplikasi yang berjalan pada satu domain mengakses sumber daya dari domain lain {i>Directory<i} 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 atribut
Access-Control-Allow-Origin
header 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 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.