如何在Laravel中接收JSON POST请求及React Native请求排障
解决React Native Fetch POST到Laravel的问题&Laravel接收方法
嘿,我来帮你一步步排查问题,同时讲清楚Laravel怎么接收这类请求:
一、React Native端的常见问题排查
先看看你的Fetch代码可能遗漏的点:
- IP地址错误:如果是真机调试,绝对不能用
http://example.com或者localhost,得换成你运行Laravel的电脑的局域网IP(比如http://192.168.1.100:8000/react_test),不然真机连不上你的本地服务器。 - CSRF令牌问题:Laravel默认对web路由的POST请求要求CSRF验证,如果你的后端路由在
web.php里,要么把路由移到api.php(api路由默认免CSRF),要么在CSRF中间件里排除这个路由(后面会讲)。 - 请求状态码排查:你的代码里没检查响应状态,建议加上这一步,能快速定位错误:
fetch('http://你的局域网IP:8000/react_test', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ name: inputName, email: inputEmail, phone: inputPhone }), }) .then((response) => { // 先检查HTTP状态是否正常 if (!response.ok) { throw new Error(`请求失败!状态码: ${response.status}`); } return response.json(); }) .then((responseJson) => { alert(JSON.stringify(responseJson)) }) .catch((error) => { console.error('请求出错:', error) }); - 变量值检查:确认
inputName、inputEmail、inputPhone这些变量有没有正确获取到用户输入,比如先console.log看看是不是undefined。
二、Laravel端接收JSON POST请求的方法
分两种路由场景来处理:
1. 推荐:用API路由(免CSRF)
把路由写到routes/api.php里:
// routes/api.php use App\Http\Controllers\YourController; Route::post('/react_test', [YourController::class, 'handleReactRequest']);
然后在控制器里接收请求,Laravel会自动解析JSON请求体,直接用这些方式获取数据:
// app/Http/Controllers/YourController.php namespace App\Http\Controllers; use Illuminate\Http\Request; class YourController extends Controller { public function handleReactRequest(Request $request) { // 方式1:直接用input()获取单个字段 $name = $request->input('name'); $email = $request->input('email'); $phone = $request->input('phone'); // 方式2:一次性获取所有JSON数据 $allData = $request->json()->all(); // 强烈建议:先做数据验证 $validatedData = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email', 'phone' => 'required|string', ]); // 这里写你的业务逻辑,比如存数据库 // ... // 返回JSON响应给React Native return response()->json([ 'status' => 'success', 'message' => '数据接收成功', 'data' => $validatedData ]); } }
2. 用Web路由(需要排除CSRF)
如果一定要用web.php的路由,得先在CSRF中间件里排除这个路由:
// app/Http/Middleware/VerifyCsrfToken.php class VerifyCsrfToken extends Middleware { protected $except = [ '/react_test', // 把你的请求路由加在这里 ]; }
之后的接收方式和API路由完全一样,Laravel会自动解析JSON请求体。
三、容易踩的坑总结
- 真机调试必须用电脑局域网IP,不能用localhost;
- 忘记处理CSRF会导致419状态码错误;
- 没做数据验证容易收到非法数据,建议一定要加
validate(); - Laravel返回响应时要用
response()->json(),确保返回标准JSON格式。
内容的提问来源于stack exchange,提问作者Berke
相关产品推荐
相关产品推荐

