当前位置: 首页 > 知识库问答 >
问题:

如何创建一个json php api,只连接给与博览会反应本机应用程序?

任云瀚
2023-03-14

我有以下PHP代码,我打算将其转换为API,以显示托管在PHP应用程序中的体育新闻和存储在MYSQL中的数据,因此我想在Expo React Native开发的应用程序中显示我的新闻记录。

$stmt = $con->prepare("SELECT
                            url,
                            cover_page,
                            alt_img,
                            mini_title,
                            mini_description,
                            date_post,
                            confg_img,
                            main_cover
                        FROM news ORDER BY id_news DESC LIMIT 5");

    //$stmt->bind_param("i", $id);
    $stmt->execute();
    $member = array();
    $stmt->bind_result(
        $member['url'],
        $member['cover_page'],
        $member['alt_img'],
        $member['mini_title'],
        $member['mini_description'],
        $member['date_post'],
        $member['confg_img'],
        $member['main_cover']
    );

    //Los {}corchetes " " especifican un objeto y " []" se utilizan para matrices de acuerdo con la especificación JSON.
    header('Content-Type: application/json');
    //header('Content-type: application/json; charset=utf-8');
    echo '[';
    $count = 0;
    while ($stmt->fetch()) {
        if( $count ) {
            echo ',';
        }

        //echo json_encode($member, JSON_UNESCAPED_SLASHES);
        echo json_encode($member, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT);

        ++$count;
    }

    echo ']';

代码已经为我生成了一个 JSON 结构,以这样的方式以 JSON 格式打印数据:

   [{
        "url": "es/deportes/futbol/ecuador/ligapro/serie-a/679/oscar-bagui-es-el-hombre-record-en-emelec",
        "cover_page": "https://i.imgur.com/UI5IaZ5.jpg",
        "alt_img": "Oscar Bagui ",
        "mini_title": "Oscar Bagui es el hombre r\u00e9cord en Emelec",
        "mini_description": "El defensa el\u00e9ctrico sigue siendo importante para los el\u00e9ctricos",
        "date_post": "2020-12-13 21:24:37",
        "confg_img": null,
        "main_cover": "featured_news"
    },{
        "url": "es/deportes/futbol/ecuador/ligapro/serie-a/675/la-dirigencia-de-liga-de-quito-quiere-cerrar-el-fichaje-de-este-jugador-del-extranjero",
        "cover_page": "https://i.imgur.com/7p6l5ZA.jpg",
        "alt_img": "Posible fichaje de Liga de Quito desde la MLS",
        "mini_title": "La dirigencia de Liga de Quito quiere cerrar el fichaje de este jugador del extranjero",
        "mini_description": "Los albos quieren potenciar su plantilla para 2021",
        "date_post": "2020-12-13 13:56:45",
        "confg_img": null,
        "main_cover": "relevant_news"
    }]

但是我这个路由example.com/api/json.php我必须创建一个代码,一个只允许与应用程序连接的键,只有具有应用程序访问键的应用程序才会显示数据,这个键在我看到的一些例子中,我意识到一些参数通过url传递。

所以我的问题是,如何打印数据在博览会反应本机但数据调用与应用程序和api json php之间的键链接

共有3个答案

水品
2023-03-14

首先,在你的应用程序中,你有一个没有人知道的密钥(例如Stackoverflow1234#@$%x)。

在你的php中,你可以用这个

<?php

if ( isset($_REQUEST['key']) && $_REQUEST["key"]== "Stackoverflow1234#@$%x") {

/// codes to connect to your DB and generate the JSON


}
?>

在你的react-native应用中,你可以使用https://www.yourdomain.com/xxx.php?key=Stackoverflow1234#@$%x来获取数据,例如:


 return fetch('https://www.yourdomain.com/xxx.php?key=' + secretkey)
         .then((response) => response.json())
         .then((responseJson) => {
           this.setState({
             retrievedata: responseJson          
             
           }, function() {
             // In this block you can do something with new state.
                          
           });
         })
         .catch((error) => {
           console.error(error);
         });

周鸿运
2023-03-14

根据阿诺德·丹尼尔斯的回答,这里是你的反应要求。

fetch('example.com/api/json', {
    method: 'POST',
    headers: {
        'Authorization': 'Bearer ' + btoa('username:password'),
    },
    body: ...
});

用户名:密码组合只是一个示例。您可以使用所需的每个编码字符串代替用户名密码组合。它必须对后端 (PHP) 端的令牌有效。

裴欣然
2023-03-14

您正在寻找的称为无记名身份验证。使用无记名身份验证,用户必须在授权HTTP标头中发送令牌才能使用API。

Authorization: Bearer <token>

在PHP中,此标头将作为$_SERVER['HTTP_AUTHORIZATION']提供。

您可以提取令牌并根据数据库进行验证。

[$type, $token] = explode(' ', $_SERVER['HTTP_AUTHORIZATION'] ?? '', 2) + ['', ''];

if (strtolower($type) !== 'bearer' || !validate_token($token)) {
    http_response_code(403); // forbidden
    echo "Missing or invalid Bearer authentication";
    exit();
}
 类似资料:
  • 我正在学习React并尝试创建一个简单的React应用程序。我想使用ES2015模块和一些ES6功能,所以我通过npm安装了Babel和browserify。 这些是我安装的节点模块: 巴贝尔 Babel-preet-es2015 巴贝尔-预设-反应 Babelify 浏览器 大口喝 反应 乙烯基缓冲液 乙烯基-源-流 反应 report-dom 我想使脚本成几个文件(像itemComponent

  • 我使用create-react-app并在其默认端口localhost:3000中托管,并且希望从同一网络上的另一个设备访问它。 我获得了主机IP的IP(使用ifconfig)192.168.0.5,并尝试打开192.168.00.5:3000,但没有成功。 有什么方法可以实现这一点吗?

  • 我试图在Android中创建一个应用程序,仅由1个广播接收器(而不是其他)组成。 广播接收器应该简单地捕捉广播(例如收到的短信,记录信息并完成)。然而,我注意到广播没有被接收器捕捉到,除非我指出我有主活动,如下Androidanifest.xml将显示: 我甚至不需要在应用程序中有一个活动类。此外,如果我在意图过滤器中删除android.intent.category.LAUNCHER或andro

  • 我已经创建了一个TestReact应用程序,并用CreateReact应用程序启动了它。我用Thread start启动它,但这将启动应用程序的调试版本。我执行了npm运行build,它创建了build文件夹,但是当我从/build文件夹启动时,它仍然会启动应用程序的调试版本。我需要它来测试优化版本的性能。我怎样才能解决这个问题?

  • JOOQ手册规定如下: jOOQ提供的所有发布服务器都将阻塞底层的JDBC连接,但是如果您为jOOQ提供io.R2DBC.spi.connection或io.R2DBC.spi.ConnectionFactory,那么发布服务器将在R2DBC驱动程序上以非阻塞的方式执行查询。 如何使用io.r2dbc.spi.Connection或io.r2dbc.spi.ConnectionFactory提供D

  • 试图从文件,包<code>C:\Users\ADMIN\Desktop\Fintech\node_modules\idb keyval\package。已成功找到json。但是,此软件包本身指定了一个无法解析的模块字段(。实际上,这些文件都不存在: C:\User\ADMIN\Desktop\Fintech\node_modules\idb-keyval\dist\compat.cjs(. loc