Nếu bạn là một nhà phát triển làm việc với APIs, bạn có thể biết tầm quan trọng của việc kiểm tra và gỡ lỗi chúng trước khi triển khai vào sản xuất. Bạn muốn đảm bảo rằng APIs của bạn đáng tin cậy, an toàn và hiệu suất tốt, và đáp ứng kỳ vọng của khách hàng và người dùng.
Nhưng làm thế nào bạn có thể kiểm tra và gỡ lỗi APIs của mình, đặc biệt là nếu chúng sử dụng gRPC, một giao thức hiện đại và hiệu quả cho việc giao tiếp giữa các vi dịch vụ? Đó chính là lúc grpc-curl có ích. grpc-curl là một công cụ dòng lệnh cho phép bạn tương tác với các máy chủ gRPC một cách đơn giản và trực quan.
Trong bài viết blog này, tôi sẽ chỉ cho bạn cách sử dụng grpc-curl để kiểm tra và gỡ lỗi APIs của bạn, và tại sao bạn nên xem xét việc sử dụng nó cho các dự án gRPC của bạn.
grpc-curl là gì?
grpc-curl là một công cụ dòng lệnh cho phép bạn gọi các phương thức RPC trên một máy chủ gRPC từ dòng lệnh. Nó hỗ trợ nhiều phương thức RPC khác nhau, bao gồm unary, server-streaming, client-streaming và bi-directional streaming. Bạn cũng có thể duyệt sơ đồ cho các dịch vụ gRPC, bằng cách truy vấn một máy chủ hỗ trợ phản chiếu máy chủ hoặc bằng cách tải các tệp protoset đã biên dịch.

grpc-curl được viết bằng .NET, và nó có một số lợi thế so với gRPCurl, chẳng hạn như:
- Nó hỗ trợ cả .NET Core và .NET Framework, và nó có thể chạy trên Windows, Linux và Mac OS.
- Nó có cú pháp ngắn gọn và biểu cảm hơn, và nó có thể suy luận tên dịch vụ và phương thức từ URL.
- Nó có thể tự động định dạng đầu ra JSON với màu sắc và thụt lề, và nó cũng có thể xuất ra XML hoặc văn bản thuần túy.
- Nó có thể xử lý tốt hơn các thông điệp lồng ghép và các trường lặp lại, và nó cũng có thể chấp nhận đầu vào từ tệp hoặc đầu vào chuẩn.
- Nó có thể sử dụng biến môi trường cho các tùy chọn chung, chẳng hạn như URL máy chủ, các tiêu đề và cài đặt TLS.
- Nó có thể tạo mã mẫu cho C#, Java, Python và Go, để giúp bạn viết mã khách hàng của riêng mình.
grpc-curl có sẵn dưới dạng gói NuGet, và bạn có thể cài đặt nó bằng lệnh sau:
dotnet tool install -g grpc-curl
Cách sử dụng grpc-curl?
Để sử dụng grpc-curl, bạn cần có một máy chủ gRPC đang chạy và bạn cần biết URL của nó và tên dịch vụ cũng như tên phương thức mà bạn muốn gọi. Bạn cũng cần có sơ đồ cho các dịch vụ gRPC, bằng cách sử dụng phản chiếu máy chủ hoặc bằng cách tải các tệp protoset.
Trong ví dụ này, tôi sẽ sử dụng một máy chủ gRPC đơn giản triển khai dịch vụ máy tính, với bốn phương thức: Thêm, Trừ, Nhân, và Chia. Máy chủ được viết bằng C#, và nó hỗ trợ phản chiếu máy chủ.
Để khởi động máy chủ, hãy chạy lệnh sau từ thư mục dự án:
dotnet run
Máy chủ sẽ lắng nghe trên cổng 5000 theo mặc định. Bạn có thể thay đổi số cổng trong tệp appsettings.json.
Để gọi phương thức Thêm trên máy chủ, hãy chạy lệnh sau từ một terminal khác:
grpc-curl http://localhost:5000 Calculator/Add -d '{"x": 3, "y": 5}'
Đầu ra sẽ trông như thế này:
{
"result": 8
}
N như bạn thấy, grpc-curl tự động suy luận tên dịch vụ và tên phương thức từ URL, và định dạng đầu ra JSON với màu sắc và thụt lề. Bạn cũng có thể sử dụng tùy chọn -o để chỉ định định dạng đầu ra khác, chẳng hạn như xml hoặc văn bản.
Để gọi phương thức Trừ, hãy chạy lệnh sau:
grpc-curl http://localhost:5000 Calculator/Subtract -d '{"x": 10, "y": 4}'
Đầu ra sẽ trông như thế này:
{
"result": 6
}
Để gọi phương thức Nhân, hãy chạy lệnh sau:
grpc-curl http://localhost:5000 Calculator/Multiply -d '{"x": 2, "y": 7}'
Đầu ra sẽ trông như thế này:
{
"result": 14
}
Để gọi phương thức Chia, hãy chạy lệnh sau:
grpc-curl http://localhost:5000 Calculator/Divide -d '{"x": 15, "y": 3}'
Đầu ra sẽ trông như thế này:
{
"result": 5
}
Nếu bạn cố gắng chia cho 0, bạn sẽ nhận được một thông báo lỗi, như thế này:
grpc-curl http://localhost:5000 Calculator/Divide -d '{"x": 15, "y": 0}'
{
"error": "Không thể chia cho 0."
}
grpc-curl cũng hỗ trợ các phương thức streaming, có thể gửi hoặc nhận nhiều thông điệp trong một cuộc gọi. Ví dụ, giả sử chúng tôi có một phương thức server-streaming gọi là Fibonacci, nhận một số n làm đầu vào và trả về n số Fibonacci đầu tiên dưới dạng dòng thông điệp. Mã máy chủ cho phương thức này trông như thế này:
public override async Task Fibonacci(Number request, IServerStreamWriter<Number> responseStream, ServerCallContext context)
{
int n = request.Value;
int a = 0;
int b = 1;
for (int i = 0; i < n; i++)
{
await responseStream.WriteAsync(new Number { Value = a });
int temp = a;
a = b;
b = temp + b;
}
}
Để gọi phương thức này với grpc-curl, hãy chạy lệnh sau:
grpc-curl http://localhost:5000 Calculator/Fibonacci -d '{"value": 10}'
Đầu ra sẽ trông như thế này:
{
"value": 0
}
{
"value": 1
}
{
"value": 1
}
{
"value": 2
}
{
"value": 3
}
{
"value": 5
}
{
"value": 8
}
{
"value": 13
}
{
"value": 21
}
{
"value": 34
}
Như bạn thấy, grpc-curl in ra mỗi thông điệp khi nó nhận được từ máy chủ và đóng kết nối khi dòng dữ liệu hoàn tất.
grpc-curl cũng hỗ trợ các phương thức client-streaming, có thể gửi nhiều thông điệp đến máy chủ và nhận một phản hồi duy nhất. Ví dụ, giả sử chúng tôi có một phương thức client-streaming gọi là Sum, nhận một dòng số làm đầu vào và trả về tổng của chúng như một phản hồi. Mã máy chủ cho phương thức này trông như thế này:
public override async Task<Number> Sum(IAsyncStreamReader<Number> requestStream, ServerCallContext context)
{
int sum = 0;
await foreach (var number in requestStream.ReadAllAsync())
{
sum += number.Value;
}
return new Number { Value = sum };
}
Để gọi phương thức này với grpc-curl, chúng tôi cần cung cấp các thông điệp đầu vào từ một tệp hoặc từ đầu vào chuẩn. Ví dụ, chúng tôi có thể tạo một tệp gọi là numbers.json với nội dung sau:
{"value": 1}
{"value": 2}
{"value": 3}
{"value": 4}
{"value": 5}
Rồi, chúng tôi có thể chạy lệnh sau:
grpc-curl http://localhost:5000 Calculator/Sum -d @numbers.json
Đầu ra sẽ trông như thế này:
{
"value": 15
}
Hoặc, chúng tôi có thể sử dụng ký tự - để chỉ ra rằng các thông điệp đầu vào đến từ đầu vào chuẩn, và sau đó gõ hoặc dán các thông điệp vào terminal, theo sau là Ctrl+D để kết thúc đầu vào. Ví dụ:
grpc-curl http://localhost:5000 Calculator/Sum -d -
{"value": 1}
{"value": 2}
{"value": 3}
{"value": 4}
{"value": 5}
^D
Đầu ra sẽ giống như trước.
grpc-curl cũng hỗ trợ các phương thức bi-directional streaming, có thể gửi và nhận nhiều thông điệp theo cả hai hướng. Ví dụ, giả sử chúng tôi có một phương thức bi-directional streaming gọi là Chat, nhận một dòng thông điệp làm đầu vào và trả về một dòng thông điệp làm đầu ra. Mã máy chủ cho phương thức này trông như thế này:
public override async Task Chat(IAsyncStreamReader<Message> requestStream, IServerStreamWriter<Message> responseStream, ServerCallContext context)
{
await foreach (var message in requestStream.ReadAllAsync())
{
Console.WriteLine($"Nhận: {message.Text}");
var reply = new Message { Text = $"Echo: {message.Text}" };
await responseStream.WriteAsync(reply);
Console.WriteLine($"Gửi: {reply.Text}");
}
}
Để gọi phương thức này bằng grpc-curl, chúng tôi cần cung cấp các thông điệp đầu vào từ một tệp hoặc từ đầu vào chuẩn, và chúng tôi cần sử dụng tùy chọn -s để chỉ ra rằng chúng tôi muốn nhận các thông điệp đầu ra như một dòng. Ví dụ, chúng tôi có thể tạo một tệp gọi là chat.json với nội dung sau:
{"text": "Xin chào"}
{"text": "Bạn khỏe không?"}
{"text": "Tạm biệt"}
Rồi, chúng tôi có thể chạy lệnh sau:
grpc-curl http://localhost:5000 Calculator/Chat -d @chat.json -s
Đầu ra sẽ trông như thế này:
{
"text": "Echo: Xin chào"
}
{
"text": "Echo: Bạn khỏe không?"
}
{
"text": "Echo: Tạm biệt"
}
Như bạn thấy, grpc-curl gửi mỗi thông điệp đến máy chủ và in ra mỗi phản hồi từ máy chủ, cho đến khi dòng đầu vào hết.

Tại sao sử dụng grpc-curl?
grpc-curl là một công cụ tiện lợi cho việc kiểm tra và gỡ lỗi các APIs gRPC của bạn, vì nó cho phép bạn:
- Gọi bất kỳ loại phương thức RPC nào, bao gồm các phương thức streaming, từ dòng lệnh, mà không cần viết bất kỳ mã khách nào.
- Duyệt sơ đồ cho các dịch vụ gRPC, bằng cách truy vấn một máy chủ hỗ trợ phản chiếu máy chủ, hoặc bằng cách tải các tệp protoset.
- Định dạng đầu ra theo nhiều cách khác nhau, chẳng hạn như JSON, XML hoặc văn bản thuần túy, với màu sắc và thụt lề.
- Xử lý các thông điệp lồng ghép và các trường lặp lại tốt hơn so với gRPCurl, và chấp nhận đầu vào từ tệp hoặc đầu vào chuẩn.
- Sử dụng biến môi trường cho các tùy chọn chung, chẳng hạn như URL máy chủ, các tiêu đề và cài đặt TLS.
- Tạo mã mẫu cho C#, Java, Python và Go, để giúp bạn viết mã khách hàng của riêng mình.
grpc-curl cũng dễ dàng cài đặt và sử dụng, và nó hoạt động trên nhiều nền tảng, chẳng hạn như Windows, Linux và Mac OS. Nó tương thích với cả .NET Core và .NET Framework, và nó hỗ trợ cả giao thức HTTP/1.1 và HTTP/2.
grpc-curl không chỉ hữu ích cho các nhà phát triển, mà còn cho các tester, kỹ sư QA, kỹ sư DevOps, và bất kỳ ai cần tương tác với các máy chủ gRPC. Nó có thể giúp bạn xác nhận chức năng, hiệu suất, an ninh và độ tin cậy của các APIs của bạn, và xác định và sửa chữa bất kỳ vấn đề hoặc lỗi nào.
Cách sử dụng grpc-curl với apidog?
Nếu bạn muốn nâng cao việc kiểm tra và gỡ lỗi gRPC của mình lên một tầm cao mới, bạn có thể muốn sử dụng grpc-curl với apidog, một công cụ mạnh mẽ và linh hoạt cho tài liệu và kiểm tra API.
Apidog là một công cụ cho phép bạn tạo, quản lý và chia sẻ tài liệu và kiểm tra API, sử dụng giao diện đơn giản và trực quan. Bạn có thể sử dụng apidog để tài liệu hóa và kiểm tra bất kỳ loại API nào, bao gồm REST, SOAP, GraphQL và gRPC.
Với apidog, bạn có thể:
- Nhập sơ đồ API của bạn từ nhiều nguồn khác nhau, chẳng hạn như OpenAPI, Swagger, WSDL, GraphQL, hoặc các tệp protoset.
- Tạo và tổ chức các điểm cuối API, phương thức, tham số, tiêu đề và phản hồi của bạn, sử dụng một trình chỉnh sửa đồ họa hoặc một trình chỉnh sửa mã.
- Thêm mô tả, ví dụ, xác thực, và chú thích cho các phần tử API của bạn, sử dụng Markdown hoặc HTML.
- Tạo tài liệu API tương tác và đẹp mắt, với các ví dụ trực tiếp, mã mẫu và sơ đồ.
- Tạo và chạy các bài kiểm tra API, sử dụng một trình chạy thử tích hợp hoặc một công cụ dòng lệnh.
- Theo dõi và gỡ lỗi các cuộc gọi API của bạn, sử dụng một proxy tích hợp hoặc một tiện ích mở rộng trình duyệt.
- Cộng tác và chia sẻ dự án API của bạn với nhóm hoặc khách hàng của bạn, sử dụng nền tảng dựa trên đám mây hoặc giải pháp tự lưu trữ.
Server Streaming
Server Streaming, như tên gọi cho thấy, liên quan đến việc gửi nhiều dữ liệu phản hồi trong một yêu cầu duy nhất. Ví dụ, nó có thể liên quan đến việc đăng ký tất cả dữ liệu giá giao dịch của chứng khoán trong một khoảng thời gian một phút.

Client Streaming
Trong chế độ này, client có thể liên tục gửi nhiều thông điệp yêu cầu đến server mà không cần chờ phản hồi ngay lập tức. Sau khi xử lý tất cả các yêu cầu, server gửi một thông điệp phản hồi duy nhất trở lại client. Cách tiếp cận này rất phù hợp cho việc truyền tải hiệu quả lượng lớn dữ liệu theo cách streaming, giúp giảm độ trễ và tối ưu hóa việc trao đổi dữ liệu.

Bi-directional Streaming
Bi-directional Streaming cho phép client và server thiết lập giao tiếp hai chiều liên tục và truyền tải nhiều thông điệp đồng thời. Nó thường được sử dụng trong game trực tuyến và phần mềm gọi video theo thời gian thực, và rất phù hợp cho các kịch bản giao tiếp theo thời gian thực và truyền tải dữ liệu quy mô lớn. Sau khi khởi tạo cuộc gọi, client và server duy trì một phiên giữa chúng và nhận phản hồi theo thời gian thực sau khi gửi các nội dung yêu cầu khác nhau.

Cộng tác trên các APIs gRPC
Apidog có thể tạo tài liệu giao diện gRPC dễ đọc từ các tệp .proto, giúp cộng tác nhóm trên các giao diện. Nhấn nút menu ở bên phải giao diện để lấy liên kết cộng tác và chia sẻ với các thành viên khác trong nhóm để đồng nhất cách gỡ lỗi giao diện.

- Tạo một tài khoản apidog, và đăng nhập vào ứng dụng web apidog.
- Tạo một dự án API mới, và đặt cho nó một tên và một mô tả.
- Nhập sơ đồ gRPC của bạn từ một tệp protoset, hoặc tạo nó thủ công bằng cách sử dụng trình chỉnh sửa đồ họa hoặc trình chỉnh sửa mã.
- Thêm các điểm cuối gRPC của bạn, phương thức, tham số, tiêu đề và phản hồi, và điền vào chi tiết và ví dụ.
- Tạo tài liệu API của bạn, và xem nó trong trình duyệt hoặc xuất nó dưới dạng tệp PDF hoặc HTML.
- Tạo các bài kiểm tra API của bạn, và chạy chúng bằng cách sử dụng trình chạy thử tích hợp hoặc công cụ dòng lệnh.
- Theo dõi và gỡ lỗi các cuộc gọi API của bạn, sử dụng proxy tích hợp hoặc tiện ích mở rộng trình duyệt.
- Chia sẻ dự án API của bạn với nhóm hoặc khách hàng của bạn, bằng cách sử dụng nền tảng dựa trên đám mây hoặc giải pháp tự lưu trữ.
Để tìm hiểu thêm về apidog, và cách sử dụng nó với grpc-curl, bạn có thể truy cập trang web apidog, hoặc xem tài liệu apidog.
Kết luận
grpc-curl là một công cụ dòng lệnh cho phép bạn tương tác với các máy chủ gRPC một cách đơn giản và trực quan. Nó dựa trên gRPCurl, nhưng bổ sung một số tính năng và cải tiến làm cho nó thân thiện với người dùng hơn và mạnh mẽ hơn. Bạn có thể sử dụng grpc-curl để kiểm tra và gỡ lỗi các APIs gRPC của bạn, và để tạo mã mẫu cho mã khách hàng của riêng bạn.
grpc-curl cũng tương thích với apidog, một công cụ dựa trên web cho tài liệu và kiểm tra API. Bạn có thể sử dụng apidog để tạo, quản lý và chia sẻ các dự án API của bạn, và để chạy và theo dõi các bài kiểm tra API của bạn.
Nếu bạn là một nhà phát triển làm việc với gRPC, hoặc nếu bạn quan tâm đến việc tìm hiểu thêm về gRPC, bạn nên chắc chắn thử nghiệm grpc-curl và Apidog. Chúng có thể giúp bạn cải thiện chất lượng và tính khả dụng của các APIs của bạn, và làm cho quy trình phát triển của bạn dễ dàng và nhanh chóng hơn.