我可以使用 MySQL 数据库通过 Xamarin 创建跨平台应用程序吗?

Can I create a cross-platform app with Xamarin using a MySQL database?

我需要为 iOS 和 android 创建一个在线商店类型的应用程序。我想对数据库使用 MySQL,我认为 Xamarin 是开发应用程序的最佳选择。这可能吗?我可以使用 Xamarin 连接到 MySQL 数据库吗?

我只用 Android Studio (Java) 和 Firebase 数据库开发过应用程序,所以我还是新手,正在学习。

如果有任何提示或建议,我也将不胜感激!谢谢!

是的,您可以通过 Xamarin 制作应用程序并连接 MySQL 数据库

第一个想法很危险,第二个比较安全

感谢 Xamarin.MySQL.Data 插件,我们可以从 Xamarin.Android 应用程序连接到 MySQL 数据库。

重要提示:在我们开始之前,请记住,因为任何应用程序都可以被反编译并且黑客可以从您的连接中获取数据,请采取预防措施或自行承担使用风险。

1。下载并安装 Xamarin.MySQL.Data 插件。

为此,我们转到 NuGet 包管理器,它位于工具 -> NuGet 包管理器和管理解决方案的 NuGet 包...

在打开的 window 中,我们切换到浏览,在那里我们将寻找 'Xamarin.MySQL.Data' 并将其安装到我们的项目中(我们接受许可)。

现在,如果我们检查项目的依赖项,我们会看到 .dll 已经存在。

2。连接到 MySQL 数据库。

对于这个例子,我将创建一个名为 TryConnection 的方法,它接收数据库用户的用户名和密码,这将允许我建立与我的数据库的连接。

using System;
using Android.Content;
using Android.Widget;
using MySql.Data.MySqlClient;
 
namespace MySQL_Xamarin
{
 public class Conexion
 {
 /// <summary>
 /// Prueba la conexión a la base de datos utilizando las credenciales correspondientes
 /// </summary>
 /// <param name="context"></param>
 /// <param name="Usuario"></param>
 /// <param name="Contrasenia"></param>
 /// <returns></returns>
 public bool TryConnection(Context context, string Usuario,string Contrasenia)
 {
 MySqlConnectionStringBuilder Builder = new MySqlConnectionStringBuilder();
 Builder.Port = 3306;
                        //Al ser una BD Online debes usar la ip de tu servidor y no localhost
 Builder.Server = "tu.servidor.mysql"; 
 Builder.Database = "tu_base_de_datos";
 Builder.UserID = Usuario; //Es el usuario de la base de datos
 Builder.Password = Contrasenia; //La contraseña del usuario
 try
 {
 MySqlConnection ms = new MySqlConnection(Builder.ToString());
 ms.Open(); //Debes agregar la referencia System.Data
 return true;
 }
 catch (Exception ex)
 {
 Toast.MakeText(context,ex.ToString(), ToastLength.Long).Show(); //Muestra un Toast con el error (Puede ser muy largo)
 return false;
 }
 }
 }
}

请记住,您不能将 'localhost' 用作服务器,除非您将 PC 配置为 MySQL 服务器,在我的例子中,我将使用 scrapywar.com 服务器。

3。检查数据库连接

为此,我有一个允许用户和密码作为连接到数据库的凭据的布局。

在MainActivity中我们要将Layout的元素赋值给同类型的对象,我们要给按钮一个action,结果如下。

//Declaración de los componentes.
Button access;
EditText User, Password;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
 //Se asignan los controles del Layout a una varaible del mismo tipo
 access = FindViewById<Button>(Resource.Id.btn_entrar);
 User = FindViewById<EditText>(Resource.Id.et_user);
 Password = FindViewById<EditText>(Resource.Id.et_password);
 
 //La accion de presionar el boton
 access.Click += delegate {
 //Se crea una instancia de la clase Conexion
 Conexion con = new Conexion();
 //Se prueba la conexion pasando los datos de los EditText que son usuario y contraseña
 if (con.TryConnection(this,User.Text,Password.Text)){
 Toast.MakeText(this, "Conexion Exitosa!", ToastLength.Long).Show();
 }
 else{
 Toast.MakeText(this, "Error!", ToastLength.Long).Show();
 }
 };
 }

4。在模拟器或设备中实施

如果你有官方 Android 模拟器或任何其他你可以直接实现应用程序,如果你想生成 APK,请访问我的 post: 'How to generate an apk in Xamarin.Android'.

我在我的设备上实现了它,正如我们所看到的,当输入正确的用户名和密码时,我收到一条 'successful connection' 消息,否则会出错。

URL : https://scrapywar.com/conectar-aplicacion-xamarin-android-a-bd-mysql-online/

注意:该页面是西班牙语,因为它是我的母语,但我已经翻译了它。

其他选项

从MySQL获取数据API

目前,我们的 routes.js 文件正在手动创建一个 JSON 用户数组,如下所示。

常量用户 = [{ ... 由于我们不再使用静态数据,我们可以删除任何数组并将其替换为 link 到我们的 MySQL 池。

// Load the MySQL pool connection
const pool = require('../data/config');

以前,/users 路径上的 GET 发送静态用户数据。我们更新后的代码将查询数据库以获取该数据。我们将对整个用户 table 使用 SQL SELECT 查询,如下所示。

SELECT * FROM users

这是我们的新 /users 路径,使用 pool.query() 方法。

// Display all users
app.get('/users', (request, response) => {
    pool.query('SELECT * FROM users', (error, result) => {
        if (error) throw error;
 
        response.send(result);
    });
});

在这里,我们 运行 执行 SELECT 查询,然后通过 /users 端点将结果作为 JSON 发送到客户端。如果重新启动服务器并转到 /users 页面,您将看到与以前相同的数据,但现在是动态的。

使用 URL 参数

到目前为止,我们的端点都是静态路径,/root 或 /users - 但是当我们只想查看有关特定用户的数据时会发生什么?我们需要使用可变端点。

对于我们的用户,我们可能希望根据每个用户的唯一标识符检索有关每个用户的信息。为此,我们将使用冒号 (:) 来指示它是路径参数。

// Display a single user by ID
app.get('/users/:id', (request, response) => {
        ...
    });
});

我们可以使用 request.params 属性 检索此路径的参数。因为我们叫id,所以我们怎么称呼它。

const id = request.params.id;

现在让我们在 SELECT 语句中添加一个 WHERE 子句,以仅获取具有指定 ID 的结果。

我们将使用 ?作为占位符来避免 SQL 注入并将 id 作为参数传递,而不是构造一个连接的字符串,这会不太安全。

pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => {
    if (error) throw error;
 
    response.send(result);
});

我们个人用户资源的完整代码现在如下所示:

// Display a single user by ID
app.get('/users/:id', (request, response) => {
    const id = request.params.id;
 
    pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => {
        if (error) throw error;
 
        response.send(result);
    });
});

现在您可以重新启动服务器并转到 https:///localhost/users/2 以仅查看 Gilfoyle 的信息。如果您收到类似 Cannot GET /users/2 的错误,则意味着您必须重新启动服务器。

转到这个 URL 其中 returns 一个结果。

[{
    id: 2,
    name: "Bertram Gilfoyle",
    email: "gilfoyle@piedpiper.com"
}]

如果是这样,恭喜您:您已成功配置动态路由参数!

发送 POST 请求

到目前为止,我们所做的一切都是使用 GET 请求。这些请求是安全的,这意味着它们不会改变服务器的状态。我们一直在查看 JSON 数据。

现在让我们开始使用 POST 请求添加新数据,使 API 真正动态化。

我在前面提到过了解您不使用 URL 中的添加或删除等动词来执行操作的文章。要将新用户添加到数据库,POST 到相同的 URL 以查看它们,但只需为其编写一个单独的路径。

// Add a new user
app.post('/users', (request, response) => {
    ...
});

请注意,我们现在使用 app.post() 而不是 app.get()。

由于我们是创建而不是读取,所以我们将使用 INSERT 查询,就像我们在数据库初始化中所做的那样。它将通过 SQL 查询传递整个 request.body。

pool.query('INSERT INTO users SET ?', request.body, (error, result) => {
    if (error) throw error;

我们还将响应的状态指定为 201,表示已创建。为了获得最后插入的元素的id,我们将使用insertId 属性.

response.status(201).send(`User added with ID: ${result.insertId}`);

我们整个POST接收代码时会是这样的。

// Add a new user
app.post('/users', (request, response) => {
    pool.query('INSERT INTO users SET ?', request.body, (error, result) => {
        if (error) throw error;
 
        response.status(201).send(`User added with ID: ${result.insertId}`);
    });
});

现在我们可以发送 POST 请求了。大多数情况下,当您发送 POST 请求时,您是通过网络表单完成的。我们将在本文末尾学习如何配置它,但使用 cURL 发送 POST 测试的最简单和最快的方法是使用 -d(--data) 标志。

我们 运行 curl -d,后跟包含所有 key/value 对和请求端点的查询字符串。

curl -d "name=Dinesh Chugtai&email=dinesh@piedpiper.com" http://localhost:3002/users

发送此请求后,您应该会收到服务器的响应。

User added with ID: 3

如果您访问 http:///localhost/users,您将看到添加到列表中的最新条目。

发送 PUT 请求

POST 对于添加新用户很有用,但您想使用 PUT 修改现有用户。 PUT 是幂等的,这意味着您可以多次发送相同的请求,它只会执行一个操作。这与 POST 不同,因为如果我们多次发送新用户请求,我们会不断创建新用户。

对于我们的 API,我们将配置 PUT 以能够处理单个用户的编辑,因此这次我们将使用 :id 路径参数。

让我们创建一个 UPDATE 查询并确保它仅适用于带有 WHERE 子句的所需 ID。我们正在使用两个?占位符和我们传递的值将按顺序排列。

// Update an existing user
app.put('/users/:id', (request, response) => {
    const id = request.params.id;
 
    pool.query('UPDATE users SET ? WHERE id = ?', [request.body, id], (error, result) => {
        if (error) throw error;
 
        response.send('User updated successfully.');
    });
});

对于我们的测试,我们编辑用户 2 并将电子邮件地址从 gilfoyle@piedpiper.com 更新为 bertram@piedpiper.com。我们可以再次使用花括号和 [-X (--request)] 标志,明确指定我们正在发送一个 post 请求。

curl -X PUT -d "name=Bertram Gilfoyle" -d "email=bertram@piedpiper.com" http://localhost:3002/users/2

请务必在发送请求之前重启服务器,否则您将收到 Cannot PUT /users/2 错误。

你应该看到这个:

用户更新成功。

现在应该更新 ID 为 2 的用户。

发送删除请求

我们完成 API 的 CRUD 功能的最后一个任务是从数据库中删除用户的选项。此请求使用带 WHERE 的 SQL DELETE 查询,并将删除由路径参数指定的单个用户。

// Delete a user
app.delete('/users/:id', (request, response) => {
    const id = request.params.id;
 
    pool.query('DELETE FROM users WHERE id = ?', id, (error, result) => {
        if (error) throw error;
 
        response.send('User deleted.');
    });
});

我们可以再次对汇总使用 -X 来发送取消。让我们删除最近创建的用户。

curl -X DELETE http://localhost:3002/users/3

您将看到成功消息。

用户已删除。

访问http://localhost:3002,你会看到现在只有两个用户。

通过请求模块发送请求。

在本文的开头,我们安装了四个依赖项,其中一个是请求模块。我可以使用所有数据创建一个新文件并将其发送出去,而不是使用汇总请求。我将创建一个名为 post.js 的文件,它将通过 POST.

创建一个新用户
const request = require('request');
 
const json = {
    "name": "Dinesh Chugtai",
    "email": "dinesh@piedpiper.com",
};
 
request.post({
    url: 'http://localhost:3002/users',
    body: json,
    json: true,
}, function (error, response, body) {
    console.log(body);
});

我们可以在新终端window中使用节点post.js调用它,而服务器是运行ning,它与使用c[=272具有相同的效果=].如果汇总不工作,请求模块很有用,因为我们可以看到错误、响应和正文。

通过 Web 表单提交申请

通常,POST 和其他改变服务器状态的 HTTP 方法使用 HTML 形式发送。在这个非常简单的示例中,我们可以在任何地方创建一个 index.html 文件,并为姓名和电子邮件创建一个字段。表单的操作将指向资源,在本例中为 http//localhost:3002/users 并将方法指定为 post.

创建 index.html 并向其中添加以下代码:

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
    <title>Node.js Express REST API</title>
</head>
 
<body>
    <form action="http://localhost:3002/users" method="post">
        <label for="name">Name</label>
        <input type="text" name="name">
        <label for="email">Email</label>
        <input type="email" name="email">
        <input type="submit">
    </form>
</body>
 
</html>

在浏览器中打开此静态 HTML 文件,在服务器 运行 正在终端中填写并提交。您应该会看到响应用户已添加 ID:4,并且您应该能够看到新的用户列表。

结论

在本教程中,我们学习了如何将 Express 服务器连接到 MySQL 数据库,并设置与 GET、POST、PUT 和 DELETE 方法以及动态路径参数对应的路由。我们还学习了如何使用汇总、Node.js 请求模块和 HTML 表单向 API 服务器发送 HTTP 请求。

此时,你应该有一个很好的了解 RESTful API 的工作原理,现在可以使用 Express 和 MySQL![=38 在 Node.js 中创建自己的 full-fledged API =]

URL : https://code.tutsplus.com/es/tutorials/code-your-first-api-with-nodejs-and-express-connect-a-database--cms-31699