作者firetim (firetim)
看板Soft_Job
标题[请益] Ajax传值到後端问题
时间Wed Oct 21 23:39:53 2020
各位大神好:
这两天自己用Google Map API 弄一个地址查询
在做连动式下拉选单时抓不到 Ajax 传的值
不论用$request, $_GET 或 $_POST 里头都是空的
Ajax 用GET 或 POST 传都一样
而我自己在後端固定抓某笔资料库的资料以 JSON 传送
或是传一笔假资料以 JSON 传送又是成功能送回前端使选单连动
但就是改回由收到 Ajax 送的来资料再进资料库找就会失败
Ajax 那里自己用 console.log('city') 确实是有东西的
已经困两天了,找了好多网站和能问的人也是没解
不晓得问题出在哪?有点开始怀疑是不是作业系统的编码问题
----------------
以下是东西的Github
https://github.com/snowtim/damaiquiz_googlemap
Ajax 写的部分在/resources/views/googlemap.blade.php 里面
第105行开始
後端写在/app/Http/Controllers/AddressController.php里面
citylinkarea 那个 function
将 Ajax 引到 controller 的 route 写在/routes/web.php
当中Route::post('/citylinkarea, ..........) 那行
作业系统:Ubuntu
後端
语言:PHP
资料库:MySQL
框架:Laravel
谢谢~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.224.206.23 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1603294796.A.19A.html
1F:→ kingofsdtw: php fpm 预设首页不是有范例? 10/21 23:54
2F:→ codepo: 你要不要直接说是哪一个档案哪一行code? 10/22 00:01
忘记了~已补上
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 00:18:40
3F:推 BigTounge: ajax的data先用JSON.stringfy试试看 10/22 00:30
4F:→ BigTounge: 然後其实有php版跟ajax版比较适合问 10/22 00:32
5F:推 jack0204: 你有没有开csrf token? 10/22 00:33
有哦~我有开
6F:→ BigTounge: 打错了 更正JSON.stringify 10/22 00:33
还是一样,不管是GET或POST都同样情形,就是当後端回传值写死能正常回传
只要改回非写死的话,除了POST我没办法用window.location进去看,会跑出
The GET method is not supported for this route. Supported methods: POST.
还有POST非写死後端传回来会出现
http://127.0.0.1:8000/citylinkarea 500 (Internal Server Error)询息外
GET就是单纯没变化,然後同样都会执行写在Ajax的error情形询息
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 01:25:33
7F:→ bigtongue: 没写过laravel 但是我看你取参数的方法跟官网写的不太 10/22 01:35
中文的版本停在5,不过当时用过5.6和5.7自己的取法是可以的
然後现在Google Map这个是版本是8的,但下方另一个function还是可以取到
9F:推 MyNion: 可惜偶4写C#的,不然我之前专题也是弄串接Google Map API 10/22 01:46
10F:→ MyNion: 然後用AJAX取值来动态改画面呈现 10/22 01:46
地图是可以出现,用写死的假资料也能标出地点
现在卡在查询地点这里办法继续下去
11F:→ plcder: ajax里面的type改成method应该就可以我之前也是用type无效 10/22 01:47
谢谢~还是相同情况QQ~一直卡在这里
後面的虽然有先写不过没办法跑完全部
根本不知道还会有什麽问题QQ~
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 02:03:05
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 02:05:12
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 02:05:42
12F:→ wesley84212: 弱弱的想请问一下,如果把 method的 request['city'] 10/22 02:26
13F:→ wesley84212: 换成$request->city这样呢 10/22 02:26
也可以哦~自己试过两种都取得到
只是我的问题还是一样
在citylinkarea的function里加了一段$request['city']没值的回传询息
结果都会跑到这一段去
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 02:34:02
14F:→ bigtongue: 建议你可以先在发送请求时看request的body 10/22 02:35
15F:→ bigtongue: 然後直接debug看request接收到了什麽东西 10/22 02:37
有~request的body都只有关於来源位址的资料
但就是没Ajax送来的东西
换成看$_GET, $_POST里头也OA都是空的
16F:→ wesley84212: 先console一下post到api之前的body看有没有问题、然 10/22 02:37
17F:→ wesley84212: 後再看一下传到laravel的内容? 可能key的大小写打错 10/22 02:37
18F:→ wesley84212: 之类的XD 10/22 02:37
您是指在data这里打成data:console.log({City: city})这样吗?
我这样打过console出来是有东西的
19F:→ bigtongue: 因为我看你js的city的c是大写php却是用小写取 10/22 02:37
20F:→ yeeeeell: data: {city: city} 大小写? 10/22 02:40
21F:→ wesley84212: Body是data: {City: city} 10/22 02:42
22F:→ wesley84212: 不过php里面是request[‘city’] 感觉怪怪的 10/22 02:42
大小写都有试过~不过还是一样的情形
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 04:26:27
23F:→ j269587: Controller的citylinkarea内 10/22 07:27
24F:→ j269587: 加个if($request->ajax()){} 10/22 07:29
25F:→ j269587: 把你其他原本写的都写在这里面试试 10/22 07:29
谢谢~不过还是一样,然後我进去看dd($request->ajax()),是false
会不会是少引入了什麽?
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 08:05:53
※ 编辑: firetim (61.224.206.23 台湾), 10/22/2020 08:09:32
26F:推 windclara: 最好大小写保持一致。有时这种小坑会害你浪费好多天 10/22 08:12
谢谢您的提醒~一开始自己是写一致的
後来一直试没效才开始大小写交叉写想了解是不是有什麽地方是规定一定得大写自己不知道
27F:推 alihue: CORS? 有开 browser console 看 log 吗 10/22 09:21
是指开发人员工具最下面那格吗?自己知道能看的地方都有开, 不晓得这是不是您说的?
28F:推 wesley84212: 还有一个问题是,你的HTML select option 只有给他te 10/22 09:33
29F:→ wesley84212: xt 没有设定value? 10/22 09:33
30F:→ wesley84212: <option value=‘’>{{ $city->city}}<option> 10/22 09:33
31F:→ wesley84212: 然後下面用.val() 10/22 09:33
32F:→ wesley84212: 还是就是要拿text而已 那当我没说XD 10/22 09:34
谢谢您~这里的确是自己没弄好,已经改了
33F:→ gundamew: 官方文件有写 $request->input('name') 10/22 12:05
34F:→ gundamew: 然後虽然自己写的专案没差,但还是建议加个 validator 10/22 12:06
35F:→ gundamew: $request->ajax() 是判断 request 种类,回 bool 正常 10/22 12:07
原来是这样~了解了
官方文件写的$request->input('name')我当时也有这样写过,但状况一样
所以当下觉得应该是在东西传到後端这部分有问题,不过一直当时找不出原因
validator因为这个东西有时间压力所以想说至少要把功能做出来
等功能OK我再回来补一些接收资料处理的间题,谢谢
36F:→ yyc1217: 用网址带参数的方式测试$_GET能否取值(query parameter) 10/22 12:53
37F:→ yyc1217: 用$_POST的话要注意虽然method都是post 但ajax跟html for 10/22 12:56
38F:→ yyc1217: m submit出去的request格式不一样 10/22 12:56
39F:→ yyc1217: 不过记得laravel已针对这点处理过了 10/22 12:56
嗯~谢谢,最後有找到问题了~ssccg大的解答
40F:推 OriginStar: 问题解决了吗,没用过Laravel,查了一下网路资料 10/22 13:09
41F:→ OriginStar: web.php只有Route::post('/citylinkarea' 10/22 13:10
42F:→ OriginStar: 所以用get method拒绝是合理的吧 10/22 13:11
43F:→ OriginStar: 另外Laravel官方文件说会以json array的方式回覆 10/22 13:12
44F:→ OriginStar: AddressController.php写死的范例看来是json array 10/22 13:14
45F:→ OriginStar: 从DB捞的部分原PO自行确认有没有转换 10/22 13:14
46F:推 OriginStar: 应该说data是array回覆的话,content-type会自动是 10/22 13:33
47F:→ OriginStar: application/json,不用自己处理,其端才能正确解析 10/22 13:34
解决了~配合您和ssccg大的解答已弄出来T T
谢谢您
48F:→ ssccg: 首先你的ajax的request的ontent-type要设成json 10/22 14:45
49F:→ ssccg: $.ajax的dataType是预期response的type (Accept header) 10/22 14:48
50F:→ ssccg: 要用contentType: 'application/json' 10/22 14:49
51F:→ ssccg: 然後同上面有人提过的,要看实际送出的HTTP request,要看 10/22 14:56
52F:→ ssccg: 浏览器开发者工具的Network那页 10/22 14:57
53F:→ ssccg: 会发现照你的$.ajax写法,送出的Content-Type是application 10/22 14:58
54F:→ ssccg: /x-www-form-urlencoded,Body的内容是JSON没错,但是在这 10/22 14:58
55F:→ ssccg: 种Content-Type下body的格式是key1=value1&key2=value2... 10/22 14:59
56F:→ ssccg: 会解析成整个JSON字串是key对应到空白value 10/22 15:00
57F:→ ssccg: 是说我不确定你最早的版本长怎样,以现在的来说其实没必要 10/22 15:27
58F:→ ssccg: Request用json(不要JSON.stringfy),预设的方式就好 10/22 15:34
感谢ssccg大~问题确实出在应该用contentType: 'application/json'
我最一开始版本是用dataType: "JSON",不过当时一样没有用
我放上去的是弄一段时间休息就传上去的
目前连动已经可以了~谢谢~
感谢上面各位的帮忙!!也让我多学到不少,为了这个弄了好多天QQ~
※ 编辑: firetim (36.235.51.151 台湾), 10/23/2020 01:55:18
※ 编辑: firetim (36.235.51.151 台湾), 10/23/2020 01:58:16