我目前正在尝试在个人 Laravel 项目中使用这个 API:https://github.com/openai-php/laravel。
我并不清楚我的代码中目前出了什么问题,我只能说下面详细描述的代码能够在聊天框中显示我的消息,但我的 POST 请求会返回一个 419 错误:XHR POST http://127.0.0.1:8000/send
,以及一个Fetch error: Server error
。
当不使用路由和控制器,而是直接将 API 端点提供给 JavaScript 时,我能够得到对我的消息的 JSON 响应…
请注意,我非常希望后端部分能够正常工作,而不仅仅是在 JS 中实现。另外,我不想使用 jQuery,但如果它能有所帮助,我会考虑使用。
JavaScript 代码:
//CSRF TOKEN const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.openai.com/v1/chat/completions', true); xhr.setRequestHeader('X-CSRF-TOKEN', csrfToken); const button = document.getElementById('button-submit'); const chatWindow = document.getElementById('chat-window'); const url = '{{ url('send') }}';//API FETCH ON BUTTON CLICK button.addEventListener('click', function (){ const input = document.getElementById('input').value; chatWindow.innerHTML += `<div class="messages-user"> <div class="__user"> <p>${input}</p> </div> <img src="{{ asset('/images/avatar.png') }}" alt="Avatar"> <div style="clear: both"></div> </div>`; fetch(url, { method: 'POST', body: JSON.stringify(input), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer "MY_OPENAI_KEY"' } }).then(function(response) { if (response.ok) { return response.text(); } else { throw new Error('Server error.'); } }).then(function(data) { chatWindow.innerHTML += `<div class="messages-bot"> <div class="__bot"> <p>${data}</p> </div> <img src="{{ asset('/images/chatbot.png') }}" alt="Avatar"> </div> `; }).catch(function(error) { console.log('Fetch error:', error.message); }); });
web.php 文件:
use Illuminate\Support\Facades\Route;use App\Http\Controllers\ChatBotController;Route::get(‘/’, function () { return view(‘welcome’);});Route::post(‘send’, [ChatBotController::class, ‘sendChat’]);
控制器:
public function sendChat(Request $request){ $result = OpenAI::completions()->create([ ‘max-token’ => 100, ‘model’ => ‘text-davinci-003’, ‘prompt’ => $request->input ]); $response = array_reduce( $result->toArray()['choices'], fn(string $result, array $choice) => $result . $choice['text'], "" ); return $response;}
感谢您的关注!
回答:
在 Laravel 中,419 错误表示 CSRF 令牌字段未被重新发送或不正确。在这种情况下,您可能不需要为 API 调用使用 CSRF 令牌。因此,您需要将以下代码行:
Route::post('send', [ChatBotController::class, ‘sendChat’]);
从 web.php 文件(使用 CSRF 保护)移动到 Laravel 项目中 routes 文件夹下的 api.php 文件中。
此时,您需要调用 /api/send
端点而不是 /send
端点