ทางแยกของ vweb พร้อมการสร้างแบบจำลองข้อมูลและการตรวจสอบความถูกต้อง
นี่คือการพิสูจน์แนวคิด
mkdir modules
cd modules
git clone https://github.com/intangere/tea.git
อาจเป็นไปตามการใช้งานปกติของ Vweb ทั้งหมด
นี่เป็นเพียงเสื้อคลุมบาง ๆ ที่ด้านบนของ Vweb ที่เปิดเผยเพียงพอที่จะเปลี่ยนลายเซ็นเส้นทางได้
มีตัวอย่างมากมายใน example.v
ตัวอย่างที่สมบูรณ์อย่างง่ายมีดังนี้:
มาสร้างเส้นทาง /login
ที่ใช้โมเดลผู้ใช้กันดีกว่า
ขั้นแรกให้นำเข้าชาและประกาศตัวแปรแอปของคุณดังนี้:
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
กำหนดรุ่น user
ของคุณ:
struct User {
username string
password string
}
กำหนดฟังก์ชันเพื่อตรวจสอบรุ่น user
ว่าถูกต้อง:
fn ( user User ) is_valid () bool {
username := user . username . strip_margin ()
password := user . password . strip_margin ()
return username . len > 3 &&
password . len > 8
}
กำหนดเส้นทาง /login
ของคุณ:
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
กำหนดฟังก์ชันหลักของคุณ:
fn main () {
mut app := App {}
}
ขณะนี้ในฟังก์ชันหลักนั้น คุณสามารถสร้างเครื่องมือตรวจสอบข้อมูล user
ของคุณได้
(คุณสามารถกำหนดสิ่งนี้ให้เป็นฟังก์ชันที่มีชื่อได้เช่นกัน)
login_validator := fn ( mut app App ) {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
app . login ( model )
}
เครื่องมือตรวจสอบข้อมูลควรคลายข้อมูลบางประเภท (ในกรณีนี้คือเนื้อหา json ของคำขอ) ตรวจสอบความถูกต้อง และส่งคืนข้อผิดพลาดในการตรวจสอบหรือส่งแบบจำลองที่ได้รับการตรวจสอบไปยังเส้นทาง ทั้งนี้ขึ้นอยู่กับผลลัพธ์
ตอนนี้แอปจำเป็นต้องทราบถึงเครื่องมือตรวจสอบและเส้นทางที่จะเรียกใช้ ดังนั้นหลังจากประกาศ validator แล้ว คุณจะต้องเพิ่มมันเข้าไปใน app.validators
:
app . validators . validators ['/ login '] = login_validator
จากนั้นเพียงเรียกใช้แอปเหมือนกับที่คุณทำกับ Vweb:
tea . run ( & app , 8080 )
/user/:user_id
เข้ากับพารามิเตอร์อื่น พารามิเตอร์ url user_id
จะต้องอยู่หลังพารามิเตอร์อื่น เช่น // this will not compile (with or without a validator defined. However it does require one)
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string , user User ) {
}
// this will compile with or without a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string ) {
}
// this will compile with a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id int ) {
}
// this is how it has to be defined and will compile (requires a validator defined for /user/:user_id)
['/ user / : user_id ']
fn ( mut app App ) user ( user User , user_id string ) {
}
tea.decode_model<T>(string)
รับสตริง json เป็นอินพุตและถอดรหัสเป็นโครงสร้างapp.url_params
เปิดเผยพารามิเตอร์เส้นทาง URL เมื่อใช้เป็น map[string]string
:user_id
เป็นพารามิเตอร์ แต่ยังคงเข้าถึงได้tea.from_map<T>(map[string]string)
สามารถใช้เพื่อรับ app.query และเปลี่ยนให้เป็นโครงสร้างที่มีฟิลด์เฉพาะสตริงเท่านั้นเมื่อใดก็ตามที่การสะท้อนเวลาคอมไพล์สมบูรณ์มากขึ้นใน V สิ่งนี้ควรจะเป็นไปได้ซึ่งจะซ่อนส่วนภายในส่วนใหญ่:
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
['/ login '; validator ]
fn ( mut app App ) login_validator () User {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
return model
}
fn main () {
mut app := App {}
tea . run ( & app , 8080 )
}