გიჟური ფორმები. Response ობიექტის აღწერა Bargage Respons html

ვთქვათ, უნდა მოვიპოვოთ მონაცემები ვებგვერდიდან, რომლის ხელით შეგროვება არაპრაქტიკული ან შეუძლებელია მისი მოცულობის გამო. ამ შემთხვევაში, ჩვენ შეგვიძლია პროცესის ავტომატიზაცია ქვემოთ აღწერილი ხელსაწყოების გამოყენებით.

ითხოვს ბიბლიოთეკას

პითონის ბიბლიოთეკა სერვერზე მოთხოვნების გასაკეთებლად და პასუხების დასამუშავებლად. პარსინგის სცენარის საფუძველი და ჩვენი მთავარი იარაღი. ამ ბიბლიოთეკის გამოყენებით ჩვენ ვიღებთ გვერდის შინაარსს html ფორმაშემდგომი გარჩევისთვის.

იმპორტის მოთხოვნების პასუხი = მოთხოვნები. get ("https://ya.ru" ) # get-request print (response . text ) # output page contents payload = ( "key1" : "value1" , "key2" : "value2" ) answer = მოთხოვნები . მიიღეთ ("http://httpbin.org/get" , params = payload ) # მოთხოვნა პარამეტრებთან ერთად headers = ( "user-agent" : "my-app/0.0.1" ) answer = მოთხოვნები . get (url, headers = headers) # მოთხოვნა კონკრეტული html სათაურებით

API

აპლიკაციის პროგრამირების ინტერფეისი - პროგრამული ინტერფეისივებ აპლიკაციის მფლობელის მიერ სხვა დეველოპერებისთვის მიწოდებული აპლიკაცია. API-ს არარსებობა, რომელსაც შეუძლია ჩვენი მოთხოვნილებების დაკმაყოფილება, არის პირველი, რაშიც უნდა დავრწმუნდეთ, სანამ ვიჩქარებთ გვერდის წყაროს კოდის გაანალიზებას და მასზე პარსერის დაწერას. ბევრ პოპულარულ საიტს აქვს საკუთარი API და დოკუმენტაცია, რომელიც განმარტავს, თუ როგორ გამოიყენოთ იგი. ჩვენ შეგვიძლია გამოვიყენოთ api ამ გზით - ვქმნით http მოთხოვნას დოკუმენტაციის მიხედვით და ვიღებთ პასუხს მოთხოვნის გამოყენებით.

BS4

Beautifulsoup4 არის ბიბლიოთეკა html და xml დოკუმენტები. გაძლევთ პირდაპირ წვდომას ნებისმიერი ტეგის შინაარსზე html-ში.

bs4-დან იმპორტი BeautifulSoup soup = BeautifulSoup (raw_html, "html.parser" ) print (suup . find ("p" , class_ = "some-class") . text ) # output ტეგის "p" შიგთავსი კლასთან ერთად "რაღაც კლასი"

სელენის ვებ დრაივერი

საიტზე მონაცემების გენერირება შესაძლებელია დინამიურად Javascript-ის გამოყენებით. ამ შემთხვევაში შეუძლებელი იქნება ამ მონაცემების გარჩევა მოთხოვნის+bs4 გამოყენებით. ფაქტია, რომ bs4 აანალიზებს გვერდის წყაროს კოდს js-ის შესრულების გარეშე. js კოდის შესასრულებლად და გვერდის იდენტური მისაღებად, რომელსაც ბრაუზერში ვხედავთ, შეგიძლიათ გამოიყენოთ სელენის ვებ დრაივერი - ეს არის დრაივერების ნაკრები. სხვადასხვა ბრაუზერები, მიეწოდება ბიბლიოთეკებს ამ დრაივერებთან მუშაობისთვის.

რა უნდა გააკეთოს, თუ არსებობს ავტორიზაცია?

session = requests.Session() data = ("login_username":"login", "login_password":"password") url = "http://site.com/login.php" answer = session.post(url, data =მონაცემები)

რა მოხდება, თუ საიტი აგიკრძალავთ ძალიან ბევრი მოთხოვნის გამო?
  • მოთხოვნებს შორის დაყოვნების დაყენება:

answer = requests.get(url, timeout=(10, 0.01)) # კავშირის დრო ამოიწურა, წაკითხვის ვადა (წამებში)

  • წარმოადგინეთ ბრაუზერი, რომელიც იყენებს სელენის ვებ დრაივერს ან გადასცემს მომხმარებლის აგენტის სათაურის შიგთავსს მოთხოვნის შესაქმნელად:

user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") მოთხოვნა = requests.get(url, headers=("User-Agent":user_agent)

  • პროქსის გამოყენება:

აღწერილი ობიექტი ძალიან სასარგებლოა და ძლიერი ინსტრუმენტი. ამ ობიექტს აქვს რამდენიმე მეთოდი, მათი აღწერა მოცემულია ქვემოთ:

კოლექციები: მეთოდები: თვისებები: პასუხი.ქუქის კოლექცია

ქუქიების კოლექცია ადგენს ქუქიების მნიშვნელობებს. თუ მითითებული ქუქიები არ არსებობს, ის ქმნის მათ. თუ ქუქი არსებობს, ის იღებს ახალ მნიშვნელობას და ანადგურებს ძველს.

Response.Cookies(cookie) [(გასაღები) | . ატრიბუტები ] = მნიშვნელობა

პარამეტრები:

  • ქუქი - ქუქი-ფაილის სახელი
  • გასაღები - არჩევითი პარამეტრი. თუ მითითებულია, მაშინ ქუქი არის დირექტორია (ჩასმული) და გასაღები არის მნიშვნელობების ნაკრები.
  • ატრიბუტები - მითითებული ინფორმაცია თავად ქუქიების შესახებ. ეს პარამეტრი შეიძლება იყოს ერთ-ერთი შემდეგი:
  • მნიშვნელობა - განსაზღვრავს მნიშვნელობას, რომელიც უნდა მიენიჭოს ამ კლავიშს ან ატრიბუტს.
სახელიაღწერა
დომენიმხოლოდ ჩაწერა. თუ მითითებულია, ქუქიები იგზავნება მხოლოდ ამ დომენის მოთხოვნით.
იწურებამხოლოდ ჩაწერა. თარიღი, როდესაც ქუქი-ფაილი იწურება. ეს თარიღი უნდა იყოს მითითებული იმისათვის, რომ ქუქი-ფაილები ჩაიწეროს კლიენტზე მყარი დისკისესიის დასრულების შემდეგ. თუ ეს ატრიბუტი არ არის დაყენებული, მაშინ ჩაითვლება ქუქიის ვადის გასვლის თარიღი მიმდინარე თარიღი. ქუქი-ფაილებს ვადა ეწურება სესიის დასრულებისთანავე.
HasKeyმხოლოდ წაკითხული. მიუთითებს შეიცავს თუ არა ქუქი მოცემულ გასაღებს.
ბილიკიმხოლოდ ჩაწერა. თუ მითითებულია, ქუქი-ფაილები იგზავნება მხოლოდ მოთხოვნის შემთხვევაში ამ ბილიკიდან. თუ პარამეტრი არ არის დაყენებული, გამოიყენება აპლიკაციის გზა.
უსაფრთხომხოლოდ ჩაწერა. მიუთითებს დაცული იქნება თუ არა ქუქიები.

კომენტარი:

თუ გასაღების ქუქი იქმნება, როგორც ნაჩვენებია შემდეგ სკრიპტში,

შემდეგ გაიგზავნება შემდეგი სათაური:

Set-Cookie:MYCOOKIE=TYPE1=შაქარი&TYPE2=ნამცხვრები

თუ თქვენ მიანიჭებთ მნიშვნელობას mycookie-ს კლავიშების გამოყენების გარეშე, მაშინ ეს ქმედება გაანადგურებს type1 და type2 კლავიშებს. მაგალითად:

წინა მაგალითში, კლავიშები type1 და type2 განადგურდება და მათი მნიშვნელობები დაიკარგება. Mycookie ახლა შეიცავს შოკოლადის მარშმლოუს მნიშვნელობას.

თქვენ ასევე შეგიძლიათ შეამოწმოთ კონკრეტული გასაღების არსებობა შემდეგი გზით:

თუ TRUE არის ნაჩვენები, მაშინ ასეთი გასაღები არსებობს, თუ FALSE არ არსებობს.

პასუხი.ჩაწერის მეთოდი

პასუხი. ჩაწერეთ ცვლადი_ან_მნიშვნელობა

პარამეტრები:

  • variable_or_value - მონაცემები, რომლებიც გამოჩნდება ბრაუზერის ეკრანზე HTML-ის საშუალებით. ეს პარამეტრი შეიძლება იყოს ნებისმიერი ტიპის, რომელსაც მხარს უჭერს VisualBasic Scripting Edition. ანუ მონაცემები შეიძლება იყოს შემდეგი ტიპის: თარიღი, სტრიქონი, სიმბოლო, რიცხვითი მნიშვნელობები. მნიშვნელობა ამ პარამეტრსარ შეიძლება შეიცავდეს %> კომბინაციებს. ამის ნაცვლად, შეგიძლიათ გამოიყენოთ ექვივალენტური კომბინაცია %\>. სკრიპტის შესრულებისას ვებ სერვერი ამ თანმიმდევრობას საჭიროდ გადააქცევს.

შემდეგი მაგალითი გვიჩვენებს, თუ როგორ მუშაობს Response.write მეთოდი კლიენტისთვის შეტყობინების გამოსატანად.

უბრალოდ გეტყვი: და შენი სახელი

შემდეგი მაგალითი ამატებს HTML ტეგს ვებ გვერდზე. ვინაიდან ეს მეთოდი არ შეიძლება შეიცავდეს %> კომბინაციას, ჩვენ ვიყენებთ თანმიმდევრობას %\>. ასე რომ, მაგალითი სკრიპტი:

გამომავალი იქნება ხაზი:

პასუხი.გადამისამართების მეთოდი

Response.Redirect URL (URL - Uniform Resource Locator)

პარამეტრები:

  • URL - პარამეტრი არის უნივერსალური რესურსის აღმწერი. ის აჩვენებს, როდის სჭირდება ბრაუზერის გადამისამართება.

კომენტარი:

ნებისმიერი მოვლენა ამ მეთოდითტეგებსა და ვებ გვერდს შორის იგნორირებული იქნება. ამ მეთოდის გამოყენება შესაძლებელია მხოლოდ HTML გვერდის თავში. ეს მეთოდი ბრაუზერს გადასცემს სათაურს, თუ ამ ობიექტის URL პარამეტრი არ არის შემდეგი ფორმით:

HTTP/1.0 302 ობიექტის გადატანილი მდებარეობის URL

პასუხი.დასრულების მეთოდი

პასუხი.დასასრული

კომენტარი:

თუ Response.Buffer თვისება დაყენებული იყო TRUE-ზე, მაშინ Response.End მეთოდის გამოძახება გაასუფთავებს ბუფერს და გადაიტანს მისგან მონაცემებს კლიენტამდე. თუ არ გსურთ მომხმარებლისთვის მონაცემების გამოტანა, უნდა გამოიძახოთ შემდეგი მეთოდი:

Response.AddHeader მეთოდი

AddHeader მეთოდი ამატებს HTML სათაურს კონკრეტული მნიშვნელობებით. ეს მეთოდი ყოველთვის ამატებს ახალ სათაურს კლიენტის ბრაუზერის პასუხს. ეს მეთოდი არ ცვლის არსებულ სათაურს ახლით. დამატებული სათაურის წაშლა შეუძლებელია.

ეს მეთოდი გამოიყენება მხოლოდ "მოწინავე" ამოცანებისთვის.

Response.AddHeader variable_name, მნიშვნელობა

პარამეტრები:

  • variable_name - ახალი HTML სათაურის პარამეტრების სახელი.
  • მნიშვნელობა - დააყენეთ მნიშვნელობა, რომელიც დაიმახსოვრდება სათაურში.
შენიშვნები:

იმისთვის, რომ მეთოდმა სწორად იმუშაოს, ცვლადი_სახელი არ უნდა შეიცავდეს ხაზგასმული სიმბოლოს (_). ServerVariables კომპლექტი განმარტავს ქვედა ხაზს, როგორც ტირე სათაურში. მაგალითად, შემდეგი სკრიპტი აიძულებს სერვერს მოძებნოს პარამეტრი HTML სათაურიდან, სახელწოდებით MY-HEADER.

ვინაიდან HTTP პროტოკოლი მოითხოვს, რომ სათაურის ყველა პარამეტრი გადაეცეს HTML გვერდის ძირამდე, თქვენ უნდა გამოიძახოთ AddHeader მეთოდი თქვენს სკრიპტში, სანამ აღწერილობა დაიწყება... არის ერთი გამონაკლისი. თუ Buffer თვისება დაყენებულია true-ზე, მაშინ შეგიძლიათ დაწეროთ AddHeader სადმე სკრიპტში, მაგრამ Flush მეთოდის პირველ გამოძახებამდე. წინააღმდეგ შემთხვევაში, AddHeader მეთოდის გამოძახება გამოიწვევს შეცდომას.

შემდეგი ორი .ASP ფაილი აჩვენებს ამ ბოლო პუნქტს.

თქვენი ტექსტი გვერდზე

IN ამ მაგალითშიგვერდი არ არის ბუფერული. სკრიპტი მუშაობს, თუმცა AddHeader გამოიძახება მანამ, სანამ სერვერი აწარმოებს HTML გამოსავალს კლიენტისთვის.

აქ არის ინფორმაცია თქვენი გვერდიდან...

მეორე მაგალითში, გვერდი ბუფერირებულია და, შედეგად, სერვერი არ აწვდის ტექსტს კლიენტს, სანამ თავად სკრიპტი არ დასრულდება ან Flush მეთოდი არ შეხვდება. თქვენ შეგიძლიათ გამოიყენოთ ეს მეთოდი სათაურის ზოგიერთი პარამეტრის მრავალი ასლის გასაგზავნად სხვადასხვა მნიშვნელობებით, როგორც WWW-Authenticate სათაურის შემთხვევაში.

Response.AppendToLog მეთოდი

AppendToLog მეთოდი ამატებს ხაზს ვებ სერვერის ანგარიშის ფაილის ბოლოს (log-file). ამ მეთოდის დარეკვა შეგიძლიათ რამდენჯერაც გჭირდებათ. მეთოდის გამოძახებისას, თქვენს მიერ მითითებული სტრიქონი ჩაიწერება სერვერის ანგარიშის ფაილში.

Response.AppendToLog მნიშვნელობა

პარამეტრები:

  • მნიშვნელობა - ტექსტი, რომელიც დაემატება ვებ სერვერის ანგარიშის ფაილს. ეს ხაზიარ შეიძლება შეიცავდეს მძიმით სიმბოლოს (,). უფრო მეტიც, დამატებული ხაზის მთლიანი სიგრძე არ უნდა აღემატებოდეს 80 სიმბოლოს.
შენიშვნები:

ამ ფუნქციის გამოსაყენებლად, თქვენ უნდა გქონდეთ ჩართული URI Query ოფცია "Advanced Logging Properties" პანელში ამ ვებ სერვერისთვის IIS-ში.

პასუხი.BinaryWrite მეთოდი

BinaryWrite მეთოდი საშუალებას გაძლევთ ჩაწეროთ მითითებული ინფორმაცია მიმდინარე HTTP გამოსავალზე ყოველგვარი სიმბოლოების გარდაქმნის გარეშე. ეს მეთოდი სასარგებლოა არასტრიქონული ინფორმაციის გამოსატანად, როგორიცაა აპლიკაციისთვის საჭირო ბინარული მონაცემები.

Response.BinaryWrite მონაცემები

პარამეტრები:

  • მონაცემები - HTTP გამოსასვლელად განკუთვნილი მონაცემები.

თუ თქვენ გაქვთ ობიექტი, რომელიც აწარმოებს ბაიტის მასივს, შეგიძლიათ გამოიყენოთ შემდეგი ზარი ამ მეთოდზე, რათა გადასცეთ ეს მასივი რომელიმე აპლიკაციას, რომელიც მუშაობს კლიენტის მანქანაზე.

პასუხი.გასუფთავების მეთოდი

Clear მეთოდი წაშლის ყველა ბუფერულ HTML გამომავალს. თუმცა, ეს მეთოდი არ შლის სათაურთან დაკავშირებულ ბუფერულ ინფორმაციას. თქვენ შეგიძლიათ გამოიყენოთ ეს მეთოდი შეცდომების სამართავად. თუმცა, ამ მეთოდის შესრულება გამოიწვევს შეცდომას, თუ Response.Buffer თვისება არ შეესაბამება სიმართლეს.

Response.CacheControl თვისება

ეს თვისება არღვევს ნაგულისხმევ მნიშვნელობას. როდესაც საკუთრებას დააყენებთ საჯაროდ, პროქსი სერვერს შეუძლია ASP-ის მიერ გენერირებული გამოსავლის ქეშირება.

Response.CacheControl [= ქეში კონტროლის სათაური]

პარამეტრები:

  • ქეშის კონტროლის სათაური - სათაურის კონტროლის ეს ვარიანტი შეიძლება იყოს საჯარო ან პირადი.
Response.CharSet თვისება

CharSet თვისება საშუალებას გაძლევთ დაამატოთ სიმბოლოების კოდის ცხრილის სახელი (მაგალითად, WINDOWS-1251) HTML სათაურში, შინაარსის ტიპის ხაზში.

Response.CharSet code_table_name

პარამეტრები:

  • charset_name - სტრიქონი, რომელიც განსაზღვრავს სიმბოლოების კომპლექტს ამ HTML გვერდისთვის. ამ კოდის ცხრილის სახელი დაემატება HTML ფაილის სათაურს "content-type" პარამეტრის ქვეშ.

ASP გვერდისთვის, რომელიც არ იყენებს Response.Charset თვისებას, სათაურში "content-type" პარამეტრი იქნება შემდეგი:

კონტენტის ტიპი: ტექსტი/html

თუ ASP ფაილი შეიცავს ბრძანებას

შემდეგ სათაურში შინაარსის ტიპის ველი ასე გამოიყურება

Content-type:text/html; charset=Windows-1251

კომენტარი:

ეს ფუნქცია ათავსებს ნებისმიერ ხაზს სათაურში და არ ამოწმებს მის ვალიდობას.

თუ გვერდი შეიცავს რამდენიმე Response.Charset ტეგს, მაშინ ყოველი მომდევნო ჩაანაცვლებს მნიშვნელობას თავისით.

Response.ContentType თვისება

ContentType თვისება გაძლევთ საშუალებას მიუთითოთ HTML ფაილის შინაარსის ტიპი (ტიპი). თუ ეს თვისება არ არის გამოყენებული, ტექსტი/html მიიღება ნაგულისხმევად.

Response.ContentType [=content_type]

პარამეტრები:

  • content_type - სტრიქონი, რომელიც აღწერს HTML შინაარსის ტიპს. ეს სტრიქონი ჩვეულებრივ იღებს ფორმას "ტიპი/ქვეტიპი", სადაც ტიპი არის შინაარსის მთავარი კატეგორია და ქვეტიპი მიუთითებს შინაარსის ტიპზე. მისაღებად სრული სიამხარდაჭერილი ტიპები - მიმართეთ თქვენი ბრაუზერის დოკუმენტაციას ან HHTP სპეციფიკაციას.

შემდეგი მაგალითი ასახავს კონტენტის ტიპის დაყენებას Channel Definition Format (Push Channels).

მეორე მაგალითი აჩვენებს თვისების დაყენებას ყველაზე ხშირად ცნობილ მნიშვნელობებზე.

პასუხი. ვადა ეწურება ქონებას

Expires თვისება განსაზღვრავს იმ პერიოდს, სანამ HTML გვერდიბრაუზერის მიერ ქეშირებული ითვლება ვადაგასულად (შენახვის ვადა). თუ მომხმარებელი ითხოვს ქეშირებულ გვერდს ბრაუზერიდან, რომელსაც ვადა არ გაუვიდა, ბრაუზერი აბრუნებს მას პირდაპირ ქეშიდან.

Response. ვადა ეწურება [=number]

პარამეტრები:

  • ნომერი - დროის რაოდენობა წუთებში, სანამ გვერდი ჩაითვლება "ვადაგადაცილებულად". ამ მნიშვნელობის 0-ზე დაყენება იწვევს მოცემული გვერდის დაუყოვნებლივ „ვადაგასულობას“.

კომენტარი:

თუ ეს თვისება დაყენებულია ერთზე მეტჯერ გვერდზე, გამოიყენება ყველაზე მცირე მნიშვნელობა.

პასუხი.იწურება აბსოლუტური საკუთრება

ExpiresAbsolute თვისება განსაზღვრავს დროსა და თარიღს, რომლის შემდეგაც ბრაუზერის მიერ ქეშირებული HTML გვერდი ვადაგასულად ითვლება (შენარჩუნების ვადა ამოიწურა). თუ მომხმარებელი ითხოვს ქეშირებულ გვერდს ბრაუზერიდან, რომელსაც ვადა არ გაუვიდა, ბრაუზერი აბრუნებს მას პირდაპირ ქეშიდან. თუ მითითებულია დრო (და მითითებულია თარიღი), მაშინ ამ გვერდის „ვადის გასვლის თარიღი“ იწურება ამ დღის შუაღამისას. თუ არც დრო და არც თარიღი არ არის მითითებული, მაშინ მნიშვნელობა ენიჭება სკრიპტის გაშვების დღისა და დროის მიხედვით.

Response.ExpiresAbsolute [= [თარიღი] [დრო]]

პარამეტრები:

  • თარიღი - მიუთითებს "შენახვის ვადის" ვადის გასვლის თარიღს. თარიღის ფორმატი უნდა შეესაბამებოდეს RFC-1123 სტანდარტს.
  • დრო - მიუთითებს გვერდის ვადის ამოწურვის დროს. ეს მნიშვნელობა გარდაიქმნება GMT (გრინვიჩის საშუალო დრო) ფორმატში, სანამ სათაური კლიენტს გაეგზავნება.

კომენტარი:

თუ მოცემული თვისება განისაზღვრა ერთზე მეტჯერ გვერდზე, მაშინ "შენახვის პერიოდის" ვადის გასვლის დრო მიიღება ყველა მითითებულ მნიშვნელობებს შორის ყველაზე ადრე.

Response.IsClientConnected საკუთრება

ეს თვისება არის მხოლოდ წაკითხვადი, რაც ნიშნავს, რომ ამ თვისებას არ შეიძლება მნიშვნელობების მინიჭება. ეს თვისება მიუთითებს, არის თუ არა კლიენტი დაკავშირებული თუ არა უკვე დაკავშირებული სერვერთან, რომელიც განსაზღვრულია Response.Write-ის ბოლოში.

Response.IsClientConnected()

კომენტარი:

ეს თვისება საშუალებას გაძლევთ განსაზღვროთ როდის არის მომხმარებელი დაკავშირებული და როდის გათიშულია სერვერთან. მაგალითად, დროის მონაკვეთი სერვერის პასუხსა და კლიენტის მოთხოვნას შორის, იძლევა ნდობას, რომ კლიენტი კვლავ დაკავშირებულია და აზრი აქვს სკრიპტის შესრულების გაგრძელებას.

- მეტი //მომხმარებელმა უნდა შეესაბამებოდეს ყველა html ობიექტს შესაბამის ათობითი მნიშვნელობებს. //ობიექტების დახატვა ათობითი მნიშვნელობებზე ნაჩვენებია ქვემოთ მოცემულ ცხრილში) საჯარო სტატიკური String escapeHtml() ( String str = "alert(\"abc\")"; სცადეთ ( StringWriter writer = new StringWriter((int) (str.length() * 1.5)); დაბრუნება null ) ) საჯარო სტატიკური გაქცევა (Writer writer, String str) აგდებს IOException ( int len ​​= str.length (); for (int i = 0; i).< len; i++) { char c = str.charAt(i); int ascii = (int) c; String entityName = (String) m.get(ascii); if (entityName == null) { if (c >0x7F) ( writer.write(""); writer.write(Integer.toString(c, 10)); writer.write(";"); ) else (writer.write(c);)) else (writer. write(entityName);

Java კოდი სიაში 1 კოდირებს HTML სტრიქონს String String "alert(\"abc\)" .

გამოიყენეთ შემდეგი პროცედურა:

შედეგად, გამომავალში გამოჩნდება შემდეგი ხაზი: alert("abc") .

ცხრილი 2 გვიჩვენებს HTML ობიექტების დახატვას მათ ათობითი მნიშვნელობებთან.
ცხრილი 2. HTML ობიექტის ათწილადი მნიშვნელობები
160 ათწილადი მნიშვნელობა ობიექტის აღწერა
60 < უწყვეტი სივრცე
62 > ნაკლები ვიდრე
38 & მეტი ვიდრე
162 ¢ ამპერსანდი
163 £ ცენტ
165 ¥ ლბ
8364 იენა
167 § ევრო
169 პარაგრაფი
174 ® საავტორო უფლება
8482 რეგისტრირებული სავაჭრო ნიშანი
სავაჭრო ნიშანი

დასკვნა ჯვარედინი სკრიპტის ინექცია არის მომხმარებლის კომპიუტერზე თავდასხმის ერთ-ერთი ყველაზე გავრცელებული მეთოდი. თუმცა, თქვენ შეგიძლიათ მნიშვნელოვნად შეამციროთ თავდამსხმელის შესაძლებლობა, დააინფიციროს თქვენი ვებ აპლიკაცია.მავნე კოდი

. თქვენი აპლიკაციის შექმნისას, ფრთხილად იყავით დაშიფვრეთ გვერდის გამომავალი მნიშვნელობები, სანამ არ გაგზავნით მათ საბოლოო მომხმარებლის ბრაუზერში.

კონტროლერებისგან პასუხის გენერირება

მაგალითად, HTML პასუხის გასაგზავნად, თქვენ უნდა შექმნათ და შეადგინოთ HTML მონაცემები და შემდეგ გაუგზავნოთ კლიენტს Response.Write() მეთოდის გამოყენებით. ანალოგიურად, მომხმარებლის ბრაუზერის სხვა URL-ზე გადასატანად, თქვენ უნდა გამოიძახოთ Response.Redirect() მეთოდი და გადასცეთ მას საჭირო URL. ორივე მიდგომა ნაჩვენებია ქვემოთ მოცემულ კოდში, რომელიც აჩვენებს BasicController კლასის გაფართოებებს, რომელიც ჩვენ შევქმენით წინა სტატიაში IController ინტერფეისის განხორციელებით:

System.Web.Mvc-ის გამოყენებით; System.Web.Routing-ის გამოყენებით; სახელთა სივრცის ControllersAndActions.Controllers ( საჯარო კლასი BasicController: IController ( საჯარო void Execute(RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestDataxt"Routeaction. "]; if (action.ToLower() == "გადამისამართება") ( requestContext.HttpContext.Response.Redirect ("/წარმოებული/ინდექსი"); ) else ( requestContext.HttpContext.Response.Write(string.Format("კონტროლერი : (0), მოქმედების მეთოდი: (1)", კონტროლერი, მოქმედება)); ) ) )

იგივე მიდგომა შეიძლება გამოყენებულ იქნას Controller კლასიდან კონტროლერის მემკვიდრეობის შემთხვევაში. HttpResponseBase კლასი, რომელიც ბრუნდება, როდესაც requestContext.HttpContext.Response თვისება წაიკითხება Execute() მეთოდით, ხელმისაწვდომია Controller.Response თვისებით, როგორც ნაჩვენებია ქვემოთ მოცემულ მაგალითში, რომელიც აფართოებს DerivedController კლასს, რომელიც ასევე ადრე შეიქმნა. მემკვიდრეობა Controller კლასიდან:

სისტემის გამოყენება; System.Web-ის გამოყენებით; System.Web.Mvc-ის გამოყენებით; სახელთა სივრცე ControllersAndActions.Controllers ( საჯარო კლასი DerivedController: Controller ( public ActionResult Index() ( // ... ) public void ProduceOutput() ( if (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" else Response.Write("Controller: Derived, Action მეთოდი: ProduceOutput");

ProduceOutput() მეთოდი იყენებს Server.MachineName თვისების მნიშვნელობას, რათა გადაწყვიტოს რა პასუხი გაუგზავნოს კლიენტს. ("ProfessorWeb" არის ჩემი განვითარების მანქანის სახელი.)

მიუხედავად იმისა, რომ მომხმარებლისთვის პასუხის გენერირების ეს მიდგომა მუშაობს, მას აქვს რამდენიმე პრობლემა:

    კონტროლერის კლასები უნდა შეიცავდეს HTML ან URL სტრუქტურის ინფორმაციას, რაც ართულებს კლასების წაკითხვას და შენარჩუნებას.

    კონტროლერი, რომელიც წარმოქმნის პასუხს პირდაპირ გამომავალზე, რთულია ერთეულის ტესტირება. თქვენ დაგჭირდებათ იმიტირებული იმპლემენტაციების შექმნა საპასუხო ობიექტიდა შემდეგ შეძლოს კონტროლერიდან გამომავალი გამოსავლის დამუშავება, რათა დადგინდეს რა არის ეს. ეს შეიძლება ნიშნავდეს, მაგალითად, HTML მარკირების გაანალიზების აუცილებლობას საკვანძო სიტყვები, რაც ხანგრძლივი და დამღლელი პროცესია.

    თითოეული პასუხის მცირე დეტალების ამ გზით დამუშავება რთული და შეცდომისკენ მიდრეკილია. ზოგიერთ პროგრამისტს მოსწონს აბსოლუტური კონტროლი, რომელიც უზრუნველყოფილია დაბალი დონის კონტროლერის აშენებით, მაგრამ ეს ჩვეულებრივ ძალიან სწრაფად რთულდება.

საბედნიეროდ, MVC Framework-ს აქვს მოსახერხებელი ინსტრუმენტი, რომელიც აგვარებს ყველა ამ პრობლემას - მოქმედებების შედეგებს. შემდეგი სექციები განმარტავს მოქმედების შედეგების კონცეფციას და აჩვენებს სხვადასხვა გზებიმისი გამოყენება კონტროლერებისგან პასუხების გენერირებისთვის.

მოქმედებების შედეგები

მოქმედების შედეგები MVC Framework-ში გამოიყენება განზრახვის განცხადებების განცალკევებისთვის განზრახვის შესრულებისგან (ბოდიშს გიხდით ტავტოლოგიისთვის). კონცეფცია მარტივი მოგეჩვენებათ, მას შემდეგ რაც გაიგებთ, მაგრამ გარკვეული დრო სჭირდება მის გაგებას გარკვეული არაპირდაპირის გამო.

საპასუხო ობიექტთან უშუალოდ ურთიერთობის ნაცვლად, მოქმედების მეთოდები აბრუნებს ActionResult-დან გამომდინარე კლასის ობიექტს, რომელიც აღწერს როგორი უნდა იყოს კონტროლერის პასუხი - მაგალითად, ხედის გადაცემა ან სხვა URL-ზე ან მოქმედების მეთოდზე გადამისამართება. თუმცა (ეს არის ძალიან ირიბი) პასუხი პირდაპირ არ არის გენერირებული. ამის ნაცვლად, იქმნება ActionResult ობიექტი, რომელსაც MVC Framework ამუშავებს შედეგის მისაღებად მოქმედების მეთოდის გამოძახების შემდეგ.

მოქმედების შედეგების სისტემა არის Command დიზაინის ნიმუშის მაგალითი. ეს ნიმუში წარმოადგენს სცენარებს, რომლებშიც ინახავთ და გადასცემთ ობიექტებს, რომლებიც აღწერს შესრულებულ ოპერაციებს.

როდესაც MVC Framework იღებს ActionResult ობიექტს ქმედების მეთოდიდან, ის იძახებს ExecuteResult() მეთოდი, განსაზღვრულია ამ ობიექტის კლასში. მოქმედების შედეგების განხორციელება შემდეგ მოქმედებს Response ობიექტზე, წარმოქმნის გამოსავალს, რომელიც შეესაბამება თქვენს განზრახვას. ამის საჩვენებლად, მოდით შევქმნათ საქაღალდე Infrastructure და დავამატოთ მას ახალი ფაილიკლასი სახელად CustomRedirectResult.cs მორგებული ActionResult განხორციელებით, რომელიც ნაჩვენებია ქვემოთ მოცემულ მაგალითში:

System.Web.Mvc-ის გამოყენებით; სახელთა სივრცის ControllersAndActions.Infrastructure ( საჯარო კლასი CustomRedirectResult: ActionResult ( საჯარო სტრიქონის URL ( მიიღეთ; დაყენება; ) საჯარო გადაფარვა void ExecuteResult (ControllerContext კონტექსტი) ( string fullUrl = UrlHelper.GenerateContentUrl.GenerateContentUrl.HerttpontextpcontextpContext. (fullUrl);

ეს კლასი ეფუძნება System.Web.Mvc.RedirectResult კლასის მუშაობას. ერთ-ერთი უპირატესობა ღია წყარო MVC Framework არის ყველაფერი იმის შესახებ, რომ შეძლოთ რაიმეს შიდა სამუშაოების შესწავლა. CustomRedirectResult კლასი გაცილებით მარტივია, ვიდრე მისი MVC ეკვივალენტი, მაგრამ საკმარისია ამ სტატიის მიზნებისთვის.

RedirectResult კლასის ინსტალაციისას, ჩვენ გადავცემთ URL-ს, რომელზეც მომხმარებელი უნდა გადამისამართდეს. ExecuteResult() მეთოდი, რომელიც შესრულდება MVC Framework-ის მიერ ქმედების მეთოდის დასრულებისას, იღებს Response ობიექტს მოთხოვნისთვის Framework-ის მიერ მოწოდებული ControllerContext ობიექტის მეშვეობით და იძახებს RedirectPermanent() მეთოდს ან Redirect() მეთოდს (ეს არის ზუსტად ის, რაც გაკეთდა IController-ის დაბალი დონის დანერგვის შიგნით, სტატიის წინა მაგალითში).

CustomRedirectResult კლასის გამოყენება ილუსტრირებულია ქვემოთ მოცემულ მაგალითში, რომელიც აჩვენებს ცვლილებებს, რომლებიც განხორციელდა მიღებული კონტროლერში:

// ... ControllersAndActions.Infrastructure-ის გამოყენებით; სახელთა სივრცის ControllersAndActions.Controllers ( საჯარო კლასი DerivedController: Controller ( public ActionResult Index() ( // ... ) public ActionResult ProduceOutput() ( if (Server.MachineName == "MyMachineName") დააბრუნებს ახალ CustomRedirectResult "/Ba Url/ ინდექსი"); else ( Response.Write("კონტროლერი: მიღებული, მოქმედების მეთოდი: ProduceOutput"); დააბრუნეთ null; ) ) ) )

გაითვალისწინეთ, რომ ჩვენ იძულებული გავხდით შეგვეცვალა მოქმედების მეთოდის შედეგი ActionResult-ის დასაბრუნებლად. ჩვენ ვაბრუნებთ null, თუ არ გვინდა, რომ MVC Framework-მა რაიმე გააკეთოს, როდესაც ჩვენი მოქმედების მეთოდი შესრულდება, რაც ჩვენ გავაკეთეთ, თუ CustomRedirectResult ინსტანცია არ დაბრუნდა.

ერთეულის ტესტირების კონტროლერები და მოქმედებები

MVC Framework-ის მრავალი ნაწილი შექმნილია იმისთვის, რომ გააადვილოს ერთეულის ტესტირება და ეს განსაკუთრებით ეხება მოქმედებებსა და კონტროლერებს. ამ მხარდაჭერის რამდენიმე მიზეზი არსებობს:

თქვენ შეგიძლიათ შეამოწმოთ მოქმედებები და კონტროლერები ვებ სერვერის გარეთ. კონტექსტურ ობიექტებზე წვდომა ხდება მათი საბაზისო კლასების მეშვეობით (როგორიცაა HttpRequestBase), რომლის დაცინვა ადვილია.

მოქმედების მეთოდის შედეგების შესამოწმებლად, თქვენ არ გჭირდებათ HTML მარკირების ანალიზი. იმის უზრუნველსაყოფად, რომ თქვენ მიიღებთ მოსალოდნელ შედეგებს, შეგიძლიათ შეამოწმოთ დაბრუნებული ActionResult ობიექტი.

კლიენტის მოთხოვნების ემულაცია არ არის საჭირო. MVC Framework-ის მოდელის სავალდებულო სისტემა საშუალებას გაძლევთ დაწეროთ მოქმედების მეთოდები, რომლებიც იღებენ შეყვანას მათ პარამეტრებში. მოქმედების მეთოდის შესამოწმებლად, თქვენ უბრალოდ დაურეკავთ მას პირდაპირ და მიაწოდებთ შესაბამისი პარამეტრის მნიშვნელობებს.

კონტროლერებისგან მონაცემების გენერირების შესახებ მომავალი სტატიები გაჩვენებთ, თუ როგორ უნდა შექმნათ ერთეულის ტესტები სხვადასხვა სახისმოქმედებების შედეგები.

არ დაგავიწყდეთ, რომ ერთეულის ტესტირება მხოლოდ სურათის ნაწილია. კომპლექსური ქცევა აპლიკაციაში ხდება მაშინ, როდესაც მოქმედების მეთოდები გამოიძახება თანმიმდევრულად. ერთეულის ტესტირება საუკეთესოდ მუშაობს სხვა ტესტირების მიდგომებთან ერთად.

ახლა, როცა იცით, როგორ მუშაობს გადამისამართების მოქმედების სპეციალური შედეგი, შეგიძლიათ გადახვიდეთ მის ეკვივალენტზე, რომელსაც გთავაზობთ MVC Framework, რომელიც უფრო ძლიერია და საფუძვლიანად არის გამოცდილი Microsoft-ის მიერ. მიღებული კონტროლერის საჭირო ცვლილება მოცემულია ქვემოთ:

// ... საჯარო ActionResult ProduceOutput() ( დააბრუნეთ ახალი RedirectResult ("/Basic/Index"); ) // ...

ამოღებულია მოქმედების მეთოდიდან პირობითი ოპერატორი, რაც ნიშნავს, რომ აპლიკაციის გაშვების და URL-ზე გადასვლის შემდეგ, როგორიცაა /Derived/ProduceOutput, ბრაუზერი გადამისამართდება URL-ზე, როგორიცაა /Basic/Index. სამოქმედო მეთოდის კოდის გასამარტივებლად, Controller კლასი მოიცავს გენერირების მოხერხებულ მეთოდებს სხვადასხვა სახის ActionResult ობიექტები. ასე რომ, მაგალითად, ჩვენ შეგვიძლია მივაღწიოთ იგივე ეფექტს, როგორც ზემოთ მოცემულ მაგალითში, Redirect() მეთოდის შედეგის დაბრუნებით:

// ... საჯარო ActionResult ProduceOutput() ( return Redirect ("/Basic/Index"); ) // ...

არაფერია განსაკუთრებით რთული მოქმედებების შედეგების სისტემაში, მაგრამ ის საბოლოოდ ეხმარება შექმნას უფრო მარტივი, სუფთა, უფრო თანმიმდევრული კოდი, რომელიც ადვილად წასაკითხი და ერთეულის ტესტირებაა. მაგალითად, გადამისამართების შემთხვევაში, შეგიძლიათ უბრალოდ შეამოწმოთ, რომ ქმედების მეთოდი აბრუნებს RedirectResult ინსტანციას, რომლის Url თვისება შეიცავს მოსალოდნელ სამიზნეს.

MVC Framework განსაზღვრავს მრავალი ჩაშენებული მოქმედების შედეგის ტიპს, რომლებიც აღწერილია ქვემოთ მოცემულ ცხრილში:

ჩაშენებული ActionResult ტიპები ტიპი აღწერა Controller კლასის Helper მეთოდები
შედეგის ნახვა

ასახავს მითითებულ ან სტანდარტული ხედვის შაბლონს

ნახვა ()
ნაწილობრივი ხედვის შედეგი

ასახავს მითითებულ ან სტანდარტული ნაწილობრივი ხედვის შაბლონს

ნაწილობრივი ხედვა ()
RedirectToRouteResult

გასცემს HTTP 301 ან 302 გადამისამართებას ქმედების მეთოდზე ან მითითებული ჩანაწერიმარშრუტი, URL-ის გენერირება მარშრუტიზაციის კონფიგურაციის მიხედვით

RedirectToAction()
RedirectToActionPermanent()
RedirectToRoute()
RedirectToRoutePermanent()
გადამისამართების შედეგი

გასცემს HTTP 301 ან 302 გადამისამართებას მოცემულ URL-ზე

გადამისამართება ()
გადამისამართება მუდმივი()
შინაარსი შედეგი

ბრაუზერში აბრუნებს არაფორმატირებული ტექსტის მონაცემებს, დამატებით აყენებს შინაარსის ტიპის სათაურს

შინაარსი ()
ფაილის შედეგი

გადასცემს ორობით მონაცემებს (როგორიცაა ფაილი დისკზე ან ბაიტის მასივი მეხსიერებაში) პირდაპირ ბრაუზერში

ფაილი ()
JsonResult

აწყობს .NET ობიექტს JSON-ში და აგზავნის პასუხად. ამ ტიპის პასუხები უფრო ხშირად წარმოიქმნება გამოყენებისას ვებ ინსტრუმენტები API და AJAX

Json ()
JavaScriptResult

აგზავნის ფრაგმენტს წყარო კოდი JavaScript, რომელიც უნდა შესრულდეს ბრაუზერის მიერ

JavaScript()
Httpარაავტორიზებული შედეგი

აყენებს HTTP პასუხის სტატუსის კოდს 401-ზე (რაც ნიშნავს „არ არის ავტორიზებული“), რაც აიძულებს ავთენტიფიკაციის მექანიზმს მოქმედებაში (აყალიბებს ავთენტიფიკაციას ან ვინდოუსის ავტორიზაცია) მოიწვიე სტუმარი შესვლისთვის

არა
HttpNotFoundResult

აბრუნებს HTTP შეცდომის კოდს 404 - არ მოიძებნა(არ მოიძებნა)

HttpNotFound()
HttpStatusCodeResult

აბრუნებს მითითებულ HTTP კოდს

არა
ცარიელი შედეგი

არაფერს აკეთებს

არა

ყველა ეს ტიპი მომდინარეობს ActionResult კლასიდან და ბევრ მათგანს აქვს მოსახერხებელი დამხმარე მეთოდები Controller კლასში. ამ ტიპის შედეგების გამოყენების დემონსტრირებას განვიხილავთ მომდევნო სტატიებში.