react+laravel从零开始构建chatbot(002后端相应的echo聊天机器人)

1,346 阅读1分钟

上一篇文章中,已经使用react hooks配合ahooks,用@livechat/ui-kit制作了一个仅有echo功能的chatbot。

接下来,本篇文章介绍用laravel(PHP框架)来实现echo,并让前后端通信。

因为在本机调试,并不需要跨域问题。如果放到服务器上,则需要解决跨域问题。跨域的事情,会在另一篇文章中单独介绍。(最新更新,文章下半部分会有跨域内容,在做调试时,react的端口与laravel端口不一致,因此只要不最终生成静态文件并放在laraval的模板里,就会存在跨域问题。)

一、安装laravel

前提是要安装php7.3 和 php的包管理工具composer。

具体安装方法可以参考 getcomposer.org/doc/00-intr…

输入如下命令,安装laravel框架:

composer global require laravel/installer

二、生成botformDashboard项目

输入如下命令,建立一个空的laravel框架项目

composer create-project --prefer-dist laravel/laravel botformdashboard

之后,进入项目目录并启动php服务器:

cd botformdashboard
php artisan serve

这个时候,访问 http://localhost:8000/ 即可看到效果:

三、写路由,完成echo功能

1、创建一个controller

php artisan make:controller Chatbot --echo

打开 app/Http/Controllers/Chatbot.php,找到public function echo函数,输入如下内容:

$data = $request->json()->all();
$text = $data['text'];
$echoText = "$text too";
return response()->json($text);

这样,就完成了echo的功能,但还必须在路由中挂载才可以。

2、在routes/web.php 路由中,挂载controller:

Route::post('/api/echo', 'Chatbot@echo');

3、使用curl进行测试:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: POST" \
    -X POST -d '{"text":"hello"}' \
    http://localhost:8000/api/echo

或用httpie进行测试

httpie 的安装,可以用任何包管理工具进行安装:

<tool> install httpie
http POST http://localhost:8000/api/echo  text=hello

结果,出现一个错误:

关键错误是:

"message": "CSRF token mismatch."

这是出于安全原因导致的。为了达成目的,先简单粗暴取消这个限制。

找到 app/Http/Middleware/VerifyCsrfToken.php ,在protected $except中添加需要取消CSRF的函数名称:

protected $except = [
    "echo"
];

现在,继续测试:

http POST http://localhost:8000/api/echo text=hello

可以看到返回了hello too:

说明后端的api已经可用了。

接下来,就是整合阶段。

实际上去掉那个验证是有问题的,因为涉及到安全,所以如有必要,还是需要加进去一些验证的环节的。但这里,暂时先不加,先力求跑通。

四、前端用fetch调用echo

在react项目中,增加一个异步请求echo服务的代码

const requestBot = async(text)=>{
const response = await fetch("http://localhost:8000/api/echo",{
    headers:{
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    },
    method:"POST",
    body:JSON.stringify({
        text: text
    })
    });
    console.log(response);
}

结果出现错误:

原来是跨域了。

接下来,在laravel中安装cors插件:

composer require fruitcake/laravel-cors

然后,生成cors配置文件:

php artisan vendor:publish --tag="cors"

接下来,把 app/Http/Middleware/VerifyCsrfToken.php 文件中定义的echo变为api/*

protected $except = [
    "api/*"
];

并在app/Console/Kernel.php中,添加:

protected $middleware = [
    \Fruitcake\Cors\HandleCors::class,
];

另其全局生效。现在,react就可以正常发送了。

五、最终效果及源码:

laravel(PHP)后端源代码:github.com/botform/das…

react前端源代码 github.com/botform/bot