The main difference between onCall and onRequest for the client is the way they are invoked from client side.
When you define a function using onCall e.g.
exports.addMessage = functions.https.onCall((data, context) => {
// ...
return ...
});
you can invoke it on the client side using the firebase function client SDK e.g.
// on the client side, you need to import functions client lib
// then you invoke it like this:
const addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
.then((result) => {
// Read result of the Cloud Function.
});
more info for onCall: https://firebase.google.com/docs/functions/callable
But if you define your function using onRequest e.g.
exports.addMesssage = functions.https.onRequest((req, res) {
//...
res.send(...);
}
you can call it using normal JS fetch API (no need to import firebase functions client lib on the client code) e.g.
fetch('<your cloud function endpoint>/addMessage').then(...)
this is the big difference that you need to consider when deciding on how to define your functions on the server.
more info for onRequest: https://firebase.google.com/docs/functions/http-events