AJAX формасы JSON күтөт, бирок HTML алат: жоопту баскыч боюнча текшерүү
200 статусу JSON экенин далилдебейт. Тармак панелин баскыч боюнча карап, ташуу, көрсөтүү жана келишим бузулууларын бөлүңүз.
Форма жөнөтүлөт, айландыргыч чыгат, ал эми консол JSON ичинде 0 ордунда күтүлбөгөн < белгиси бар дейт. Барактын өзү жакшы жүктөлөт, ошондуктан биринчи ой парсерди же туннелди күнөөлөө. Адатта экөө тең катышпайды: жөнөтүү баракты жүктөөдөн башка сурам, ал эми ал JSON эмес нерсе менен кайтты. Браузер чындыгында көрсөткөн тартипте иштеңиз, анткени төрт мүмкүн болгон жооп төрт башка оңдоону талап кылат.
1-баскыч: чындыгында болгон жөнөтүүнү кармаңыз
Жөнөтүүдөн мурун Тармак панелин ачыңыз, журналды навигациялар арасында жазууларды сактай тургандай жөндөңүз, анан пайдаланууга уруксат берилген аккаунтта бир зыянсыз сыноо жөнөтүү жасаңыз. Барактын документ сурамын эмес, форма өзү баштаган сурамды тандаңыз.
Чыпкалардан этиет болуңуз. XHR же Fetch чыпкасы ыңгайлуу, бирок алкак дагы эле жашыруун iframe же динамикалык жаралган форма аркылуу жөнөтсө, чыпка жалгыз маанилүү сурамды жашырат. Адегенде чыпкасыз бир жолу жөнөтүп, эмне чыкканын караңыз.
Тандалган сурам үчүн кандайдыр бир түшүндүрмөдөн мурун алты нерсени жазыңыз: ыкма, сурам сабы менен кошо толук URL, статус, кайра багыттоо тизмеги, жооптун Content-Type жана дененин алгачкы саптары. Chrome DevTools’тун Тармак панелинин колдонмосу булар жайгашкан Headers, Response жана Initiator көрүнүштөрүн камтыйт, башка браузерлердин окшош панелдери ошол эле талааларды көрсөтөт.
2-баскыч: бул сиз ойлогон сурам экенине ишениңиз
Таң каларлык көп JSON каталары чындыгында маршруттоо каталары. Эгер жөнөтүү иштетүүчүсү preventDefault чакыруудан мурун иске таштаса, браузер action атрибутунда жазылган дарекке форманын түпкү POST’ун жасайт, сервер толук HTML барак менен жооп берет. Иштетүүчү эч качан иштебейт, ошондуктан JSON эч качан суралган эмес.
Панелдеги URL’ды JavaScript чакырган URL менен салыштырыңыз. Башка жерде бүткөн кайра багыттоону, жетишпеген же ашыкча акыркы кыйгач сызыкты, иштетүүчү GET жиберип, акыркы чекит POST кабыл алган ыкма дал келбестигин же көчүрүлгөн барактан салыштырмалуу жолго жиберген форманы издеңиз. Кайра багыттоо тизмегин аягына чейин байкап, биринчи эмес, акыркы URL’ды жазыңыз.
Анан баштоочуну текшериңиз. Эгер сурам сиздин скриптиңизден эмес, документ навигациясынан келсе, көйгөйдү буга чейин таптыңыз, ал эми жооп парсериндеги эч кандай өзгөртүү жардам бербейт.
3-баскыч: натыйжаны төрт категорияга бөлүңүз
Ар бир натыйжа ушулардын так бирине таандык, ал эми категория мындан ары кайда кароону аныктайт.
| What you see | Category | Where to look |
|---|---|---|
| Request never finishes, TLS or connection error | No usable response | Endpoint reachability, certificate, front-end timeout |
| Request completes, script gets an opaque failure | Access blocked | Cross-origin policy, credentials mode, missing response header |
| 200 with an HTML body or a login form | Wrong representation | Redirect, expired session, route fallback, error handler |
| Body begins with a notice then valid JSON | Wrong representation | Server-side warning output before serialisation |
| Valid JSON, framework rejects it | Contract mismatch | Envelope shape, field names, value types |
Ортодогу саптарды адамдар туура эмес диагноздойт, анткени статус 200. Кайра багыттоодон кийин жеткен кирүү барак толугу менен жакшы HTTP жообу жана абдан начар JSON документ. application/json мазмун түрү муну оңдобойт: ал белги гана, ал эми туура эмес белгиленген дене дагы эле парсталбайт. Жетүү бөгөттөлдү деген сап бүткөн сурамга окшош: панель статусту көрсөтөт, бирок кросс-келип чыгуу саясаты денени кармап калат, ошондуктан чакырган скрипт үчүн ал убакыт бүткөндөй пайдасыз.
Төртүнчү сап эски PHP жана алкак стектеринде дагы ушунчалык кеңири таралган. Коддолгон жүктөмдөн мурун басылган эскирүү эскертүүсү эч бир JSON парстери кабыл албаган дене жаратат, көп учурда ошол эскертүү бүт түшүндүрмө болуп калат.
4-баскыч: парсердин катасын сөзмө-сөз окуңуз
Ката тексти парстоону бузган биринчи белгини атайт, бул адатта эч кандай божомолсуз категорияны аныктайт.
| Error text (Chrome/V8) | What it means |
|---|---|
| Unexpected token < in JSON at position 0 | The body starts with markup: an HTML page or an error document |
| Unexpected end of JSON input | Empty body, or the response was truncated |
| Unexpected token o in JSON at position 1 | You parsed something already parsed, typically an object rather than text |
| Unexpected token u | The body starts with the bare word undefined, usually an empty response rendered as a string |
200 менен бош дене өзүнчө учур: акыркы чекит иштеди, эч нерсе өндүргөн жок, ал эми төмөндөгү бир нерсе аны ийгилик деп кабыл алды. Бул ташуу эмес, колдонмо келишиминин бузулушу, анын орду проксиде эмес, кийинки баскычта. Firefox жана Safari ошол эле төрт бузулушту башкача айтат, ошондуктан так сапка эмес, белгиге же бош денеге дал келтириңиз.
5-баскыч: далилдер көрсөткөн катмарды оңдоңуз
Маршруттоо көйгөйүндө сурамды оңдоңуз: action’ды түзөтүңүз, иштетүүчүнүн кулашына жол бербеңиз, акыркы чекит менен ыкманы дал келтириңиз жана кайра сынаңыз. Көрсөтүү көйгөйүндө денени жараткан нерсени оңдоп, маалымат күтүлгөн жерде ката документи эмне үчүн кайтарыларын аныктаңыз. Келишим көйгөйүндө алкактын чыныгы күтүлгөн түзүлүшүн сиз иштеткен версия үчүн окуп, кардарды бошотуунун ордуна жоопту ошого жараша түзүңүз.
Жетүүсү бөгөттөлгөн жооп өзүнчө жүрүш талап кылат, анткени сурамдын өзү туура болушу мүмкүн жана дене сиздин кодго эч качан жетпеши мүмкүн. Жооптун Access-Control-Allow-Origin’ин браузер жиберген так Origin менен салыштырыңыз жана жапайы белгинин ыйгарым укуктуу сурамды канааттандырбастыгын унутпаңыз. Кардардагы credentials: 'include'’ди сервердеги Access-Control-Allow-Credentials: true менен жупташтырыңыз жана чакыруу no-cors режимин колдонбогонун текшериңиз, ал жерде тунук эмес дене кемчилик эмес, документтелген натыйжа.
Парсерди андан жумшаак нерсе менен алмаштыруу — качуу керек болгон жалгыз оңдоо. Жоопту код катары баалоо же парсталганга чейин текстти кырып салуу келишим дал келбестигин жашырат жана үнсүздүктүн ордуна инъекция бети кошулат. Ошондой эле статусту денеден өзүнчө текшерүү зарыл: колдонмо деңгээлиндеги ката объектисин алып жүргөн 200 көп API’лерде кадимки жана жүктөмдү окуп иштетүү керек.
Башка бирөөнүн жардамы керек болгондо чийки экспорттун ордуна эң аз жазууну бөлүшүңүз — ыкма, URL, статус, кайра багыттоолордон кийинки акыркы URL, жооптун мазмун түрү, дененин формасы жана күтүлгөн келишим. Тармак архивдеринде cookie, токендер, сурам саптары жана формадагы жеке маалыматтар бар, автоматтык тазалагыч текшерүү эмес.
- Кандайдыр бир кодду өзгөртүүдөн мурун сурамды чыпкасыз кармаңыз.
- Баштоочу сиздин скрипт болгонун жана акыркы URL сиздин акыркы чекитиңиз экенин ырастаңыз.
- Парсерге тийүүдөн мурун жоопту классификациялаңыз.
- Маршруттоону, жетүүнү, көрсөтүүнү же келишимди оңдоңуз жана эч качан парсерди бошотуу менен эмес.