Modul-modul terkait RPC adalah APMobileNetwork.framework dan MPMgsAdapter. Anda dapat menggunakan antarmuka dalam MPMgsAdapter.
Topik ini menjelaskan langkah-langkah penggunaan kit pengembangan perangkat lunak (SDK) Mobile Gateway Service:
Inisialisasi layanan gateway
Anda dapat memanggil metode berikut untuk menginisialisasi layanan gateway:
[MPRpcInterface initRpc];Catatan saat melakukan upgrade dari versi sebelumnya
Mulai dari versi 10.1.32, Anda tidak perlu lagi menambahkan file Category untuk kelas DTRpcInterface karena lapisan tengah membaca konfigurasi dari meta.config. Setelah melakukan upgrade, periksa proyek Anda untuk konfigurasi dari versi sebelumnya dan hapus konfigurasi tersebut. Gambar berikut menunjukkan file Category untuk kelas DTRpcInterface yang harus Anda hapus.

Hasilkan kode RPC
Setelah aplikasi Anda terhubung ke layanan backend di Konsol Mobile Gateway Service, Anda dapat mengunduh kode RPC sisi client. Untuk informasi selengkapnya, lihat Hasilkan kode.
Kode RPC yang diunduh memiliki struktur sebagai berikut:

Di mana:
RPCDemoCloudpay_accountClientadalah konfigurasi RPC.RPCDemoAuthLoginPostReqadalah model permintaan.RPCDemoLoginResultadalah model respons.
Kirim permintaan
Anda dapat memanggil permintaan RPC di subthread menggunakan antarmuka panggilan subthread yang dikapsulkan dalam MPRpcInterface di lapisan tengah. Metode callback berjalan di thread utama secara default. Kode berikut memberikan contoh:
- (void)sendRpc
{
__block RPCDemoLoginResult *result = nil;
[MPRpcInterface callAsyncBlock:^{
@try
{
RPCDemoLoginRequest *req = [[RPCDemoLoginRequest alloc] init];
req.loginId = @"alipayAdmin";
req.loginPassword = @"123456";
RPCDemoAuthLoginPostReq *loginPostReq = [[RPCDemoAuthLoginPostReq alloc] init];
loginPostReq._requestBody = req;
RPCDemoCloudpay_accountClient *service = [[RPCDemoCloudpay_accountClient alloc] init];
result = [service authLoginPost:loginPostReq];
}
@catch (NSException *exception) {
NSLog(@"%@", exception);
NSError *error = [userInfo objectForKey:@"kDTRpcErrorCauseError"]; // Dapatkan informasi pengecualian detail
NSInteger code = error.code; // Dapatkan kode kesalahan dari informasi pengecualian detail
}
} completion:^{
NSString *str = @"";
if (result && result.success) {
str = @"Logon berhasil";
} else {
str = @"Logon gagal";
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:str message:nil delegate:nil
cancelButtonTitle:nil otherButtonTitles:@"ok", nil];
[alert show];
}];
}Gunakan
try catchuntuk menangkap pengecualian. Pengecualian akan dilemparkan jika gateway mengalami gangguan. Anda dapat menemukan penyebabnya di Kode hasil gateway.RPC Swift tidak dapat menggunakan
try catchuntuk menangkap pengecualian. Untuk informasi selengkapnya, lihat Tangani pengecualian Objective-C secara aman di Swift.
Tangani pengecualian Objective-C secara aman di Swift
Latar Belakang
Mekanisme penanganan kesalahan Swift (do-catch) berbeda dengan mekanisme penanganan pengecualian Objective-C (@try-@catch) pada level rendah. Akibatnya, kode Swift tidak dapat langsung menangkap NSException yang dilemparkan oleh kode Objective-C. Hal ini dapat menyebabkan aplikasi crash di lingkungan pemrograman campuran.
Solusi
Untuk mengatasi masalah ini dan memastikan stabilitas aplikasi, Anda dapat menggunakan tool APRpcExceptionCatch. Metode safeExecuteTry-nya mengenkapsulasi logika @try-@catch Objective-C. Hal ini memungkinkan Anda mengeksekusi panggilan RPC secara aman di lingkungan Swift.
Jika kode Objective-C melemparkan pengecualian selama eksekusi, safeExecuteTry akan menangkapnya dan mengembalikannya sebagai objek DTRpcException. Jika kode dieksekusi secara normal, metode ini mengembalikan nil.
Versi
Didukung mulai dari baseline versi 10.2.3.66 dan seterusnya.
Kode contoh
import MBProgressHUD
import APMobileNetwork
private func performGetIdRpcCall() {
// 1. Tampilkan indikator pemuatan (awal asli dari executeRpc).
MBProgressHUD.showAdded(to: self.view, animated: true)
// 2. Definisikan variabel untuk menerima hasil dan kesalahan.
var response: MPDemoUserInfo? // Ganti tipe generik T dengan tipe spesifik MPDemoUserInfo.
var rpcError: DTRpcException?
// 3. Eksekusi panggilan RPC secara asinkron (aslinya DTRpcAsyncCaller.callAsyncBlock).
DTRpcAsyncCaller.callAsyncBlock({
// 3.1. Eksekusi panggilan RPC aktual secara aman di thread latar belakang.
rpcError = APRpcExceptionCatch.safeExecuteTry {
// Ini adalah isi closure 'call' asli.
let client = MPDemoRpcDemoClient()
// Tetapkan hasil ke variabel respons.
response = client.getIdGet(self.getRequest())
}
}, completion: {
// 4. Tangani logika penyelesaian di thread utama.
DispatchQueue.main.async {
// 4.1. Sembunyikan indikator pemuatan.
MBProgressHUD.hide(for: self.view, animated: true)
// 4.2. Periksa apakah panggilan RPC mengalami kesalahan.
if let exception = rpcError {
// Jika terjadi kesalahan, buat dan tampilkan pesan kesalahan.
var errorMsg: String
if exception.code.rawValue == 0 {
if let realError = exception.userInfo?["kDTRpcErrorCauseError"] as? NSError {
let errorString = "Error: [Domain: \(realError.domain), Code: \(realError.code), Description: \(realError.localizedDescription)]"
errorMsg = "Rpc Exception: \(errorString)"
} else {
let cause = exception.userInfo?["kDTRpcErrorCauseError"]
errorMsg = "Rpc Exception code: \(exception.code), no real error: \(cause ?? "nil")"
}
} else {
errorMsg = "Rpc Exception code: \(exception.code)"
}
// Tampilkan toast kesalahan.
self.showErrorToast(message: errorMsg)
} else {
// 4.3. Jika panggilan berhasil, proses data yang dikembalikan.
// Ini adalah isi closure 'success' asli.
self.showAlert(title: "Data yang Dikembalikan", message: response?.description)
}
}
})
}
Sesuaikan konfigurasi permintaan
DTRpcMethod menjelaskan metode permintaan RPC. Objek ini mencatat informasi tentang permintaan, seperti nama metode, parameter, dan tipe kembalian.
Jika Anda tidak perlu menambahkan signature saat mengirim permintaan, atur properti
signCheckdariDTRpcMethodmenjadi NO.-(MPDemoUserInfo *) dataPostSetTimeout:(MPDemoPostPostReq *)requestParam { DTRpcMethod *method = [[DTRpcMethod alloc] init]; method.operationType = @"com.antcloud.request.post"; method.checkLogin = NO ; method.signCheck = NO ; method.returnType = @"@\"MPDemoUserInfo\""; return [[DTRpcClient defaultClient] executeMethod:method params:@[ ]]; }Untuk mengatur periode timeout, konfigurasikan properti
timeoutIntervaldariDTRpcMethod.-(MPDemoUserInfo *) dataPostSetTimeout:(MPDemoPostPostReq *)requestParam { DTRpcMethod *method = [[DTRpcMethod alloc] init]; method.operationType = @"com.antcloud.request.post"; method.checkLogin = NO ; method.signCheck = YES ; method.timeoutInterval = 1; // Periode timeout ini adalah waktu hingga client menerima respons dari gateway. Periode timeout sisi server adalah waktu hingga respons dikembalikan dari sistem bisnis backend. Nilai default adalah 20 detik. Nilai kurang dari 1 tidak valid dan akan menggunakan nilai default. method.returnType = @"@\"MPDemoUserInfo\""; return [[DTRpcClient defaultClient] executeMethod:method params:@[ ]]; }Untuk menambahkan header ke antarmuka, gunakan metode ekstensi berikut dari
DTRpcClient.-(MPDemoUserInfo *) dataPostAddHeader:(MPDemoPostPostReq *)requestParam { DTRpcMethod *method = [[DTRpcMethod alloc] init]; method.operationType = @"com.antcloud.request.postAddHeader"; method.checkLogin = NO ; method.signCheck = YES ; method.returnType = @"@\"MPDemoUserInfo\""; // Tambahkan header untuk antarmuka NSDictionary *customHeader = @{@"testKey": @"testValue"}; return [[DTRpcClient defaultClient] executeMethod:method params:@[ ] requestHeaderField:customHeader responseHeaderFields:nil]; }Untuk menambahkan header ke semua antarmuka, Anda dapat menggunakan interceptor. Untuk informasi selengkapnya, lihat contoh kode Mobile Gateway Service.
Properti
checkLogindigunakan untuk verifikasisessionantarmuka. Verifikasi ini memerlukan konfigurasi di Konsol gateway. Secara default, properti ini diatur ke NO.
Sesuaikan interceptor RPC
Anda mungkin perlu memproses logika sebelum permintaan RPC dikirim atau setelah diproses. Modul RPC menyediakan mekanisme interceptor untuk tujuan ini.
Sesuaikan interceptor
Anda dapat membuat interceptor dan mengimplementasikan metode protokol <DTRpcInterceptor> untuk menangani operasi sebelum dan sesudah permintaan RPC.
@interface HXRpcInterceptor : NSObject<DTRpcInterceptor>
@end
@implementation HXRpcInterceptor
- (DTRpcOperation *)beforeRpcOperation:(DTRpcOperation *)operation{
// TODO
return operation;
}
- (DTRpcOperation *)afterRpcOperation:(DTRpcOperation *)operation{
// TODO
return operation;
}
@endDaftarkan interceptor
Anda dapat memanggil antarmuka ekstensi lapisan tengah untuk mendaftarkan sub-interceptor kustom ke dalam wadah interceptor.
HXRpcInterceptor *mpTestIntercaptor = [[HXRpcInterceptor alloc] init]; // Sub-interceptor kustom
[MPRpcInterface addRpcInterceptor:mpTestIntercaptor];Enkripsi data
RPC menyediakan beberapa fitur konfigurasi enkripsi data. Untuk informasi selengkapnya, lihat Enkripsi data.