All Products
Search
Document Center

Object Storage Service:Mode bayar-per-permintaan (Go SDK V1)

Last Updated:Nov 29, 2025

Dalam mode bayar-per-permintaan, pihak peminta menanggung biaya traffic dan permintaan yang dihasilkan dari akses data dalam bucket, sedangkan pemilik bucket hanya membayar biaya penyimpanan. Fitur ini memungkinkan Anda berbagi data tanpa menanggung biaya traffic dan permintaan yang timbul.

Catatan penggunaan

  • Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.

  • Kredensial akses pada topik ini diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.

  • Instans OSSClient pada topik ini dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Konfigurasi client (Go SDK V1).

  • Untuk mengaktifkan bayar-per-permintaan, Anda harus memiliki izin oss:PutBucketRequestPayment. Untuk mengambil konfigurasi bayar-per-permintaan, Anda harus memiliki izin oss:GetBucketRequestPayment. Untuk informasi selengkapnya, lihat Berikan izin kustom kepada RAM user.

Mengatur mode bayar-per-permintaan

Kode berikut menunjukkan contoh cara mengaktifkan bayar-per-permintaan.

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Buat instans OSSClient.
	// Setel yourEndpoint ke Endpoint bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Endpoint-nya.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayahnya.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		fmt.Println("New Error:", err)
		os.Exit(-1)
	}

	// Inisialisasi mode bayar-per-permintaan.
	reqPayConf := oss.RequestPaymentConfiguration{
		Payer: "Requester",
	}

	// Atur mode bayar-per-permintaan.
	err = client.SetBucketRequestPayment("<yourBucketName>", reqPayConf)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

Mendapatkan konfigurasi mode bayar-per-permintaan

Kode berikut menunjukkan contoh cara mengambil informasi konfigurasi bayar-per-permintaan.

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Buat instans OSSClient.
	// Setel yourEndpoint ke Endpoint bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Endpoint-nya.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayahnya.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Dapatkan konfigurasi mode bayar-per-permintaan.
	ret, err := client.GetBucketRequestPayment("yourBucketName")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Cetak informasi konfigurasi mode bayar-per-permintaan.
	fmt.Println("Bucket request payer:", ret.Payer)
}

Akses objek sebagai pihak ketiga peminta

Saat pihak ketiga melakukan operasi pada suatu objek, permintaan tersebut harus menyertakan parameter x-oss-request-payer:requester dalam Header HTTP. Jika tidak, permintaan akan mengembalikan error.

Kode berikut menggunakan operasi PutObject, GetObject, dan DeleteObject sebagai contoh untuk menunjukkan cara menentukan pembayar pihak ketiga saat mengakses objek. Metode penentuan pembayar untuk operasi baca-tulis lainnya pada objek serupa.

package main

import (
	"fmt"
	"io"
	"os"
	"strings"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Buat instans OSSClient.
	// Setel yourEndpoint ke Endpoint bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Endpoint-nya.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayahnya.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	payerClient, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		fmt.Println("New Error:", err)
		os.Exit(-1)
	}

	// Tentukan nama bucket.
	payerBucket, err := payerClient.Bucket("examplebucket")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Setelah pemilik bucket mengaktifkan mode bayar-per-permintaan, pihak luar yang melakukan permintaan harus menyetel parameter oss.RequestPayer(oss.Requester) untuk mengakses konten yang diizinkan.
	// Jika pemilik bucket belum mengaktifkan mode bayar-per-permintaan, pihak luar dapat mengakses konten yang diizinkan tanpa menyertakan parameter oss.RequestPayer(oss.Requester).

	// Unggah objek.
	// Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt.
	key := "exampledir/exampleobject.txt"
	err = payerBucket.PutObject(key, strings.NewReader("objectValue"), oss.RequestPayer("requester"))
	if err != nil {
		fmt.Println("put Error:", err)
		os.Exit(-1)
	}

	// Daftar semua objek dalam bucket.
	lor, err := payerBucket.ListObjects(oss.RequestPayer(oss.Requester))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Cetak daftar nama objek.
	for _, l := range lor.Objects {
		fmt.Println("the Key name is :", l.Key)
	}

	// Unduh objek.
	body, err := payerBucket.GetObject(key, oss.RequestPayer(oss.Requester))
	if err != nil {
		fmt.Println("Get Error:", err)
		os.Exit(-1)
	}
	// Setelah membaca data, tutup aliran. Jika Anda tidak menutup aliran, dapat terjadi kebocoran koneksi. Hal ini dapat menghabiskan koneksi yang tersedia untuk permintaan dan menyebabkan program gagal.
	defer body.Close()

	// Baca dan cetak konten yang diperoleh.
	data, err := io.ReadAll(body)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println("data:", string(data))

	// Hapus objek.
	err = payerBucket.DeleteObject(key, oss.RequestPayer(oss.Requester))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

Referensi

  • Untuk kode contoh lengkap mengenai mode bayar-per-permintaan, lihat Contoh GitHub.

  • Untuk informasi selengkapnya mengenai operasi API untuk mengaktifkan bayar-per-permintaan, lihat PutBucketRequestPayment.

  • Untuk informasi selengkapnya mengenai operasi API untuk mengambil informasi konfigurasi bayar-per-permintaan, lihat GetBucketRequestPayment.