Opi työskentelemään GET- ja POST-pyyntöjen kanssa. Perl - Lähetä tiedostoja HTTP-palvelimelle pyynnöllä Inurl post add php käyttäjätunnus karkea

2. heinäkuuta 2009 klo 16.05

Perl - Tiedostojen lähettäminen HTTP-palvelimelle pyynnöstä

  • Perl

Itse asiassa siinä ei ole mitään omaperäistä, dokumentaatiota on riittävästi, jopa enemmän, vaikka jälkimmäinen aiheuttaa erittäin voimakasta melankoliaa. Siksi on helpompi näyttää kerran käytännössä, miten ja mitä tehdään, kuin lukea kymmenen kertaa ja astua haravalle. Kunto: Jotkut binaaritiedostot sijaitsevat paikallisesti, on palvelin, jolle meidän on asetettava nämä tiedostot, tällä palvelimella on komentosarja (lomakeprosessori), joka lataa tiedostoja
Tehtävä: Nämä tiedostot on lisättävä verkkoliittymän (lomakekäsittelijän) kautta palvelimelle, aivan kuin olisimme selain ja lähettäisimme tiedot lomakkeen kautta.

LWP::UserAgentin käyttö

Pyynnön luontialgoritmi:
  • Luo pyyntö (HTTP::Request);
  • Luo "selain" (LWP::UserAgent);
  • Määritämme sille otsikot;
  • Lähetä pyyntö;
Se on tylsää, kuten XML::LibXML, mutta se on luotettava, joten: Perl-koodi (1) #!/usr/bin/perl use range; käytä varoituksia; käytä LWP::UserAgent; # Tämä on tiedosto, joka lähetetään minun $file = "./files/some_file.bin"; # Tämä on URI, johon lähetämme pyynnön my $uri = "http://somedomain.com/form/action/script"; # Pyyntöobjekti my $request = HTTP::Request->new("POST", $uri); # Luomme erottimen, koska jos emme pakota sitä, niin $ua->request($request) ei sisälly pääotsikkoon # vaikka voit tehdä $request->as_string otsikkoobjektin muodostamisen jälkeen , silloin se korvataan oletusarvolla, mutta emme ota sitä riskiin minun $boundary = "X"; minun @rand = ("a".."z", "A".."Z"); for (0..14) ($boundary .= $rand;) # Muodosta otsikko: $request->header("Content-Type" => "multipart/form-data; boundary=".$boundary); $request->header("User-Agent" => " Mozilla Firefox 5.0 :-)"); $request->header("Referer" => " http://somedomain.com/form"); $request->protocol("HTTP/1.0"); # Vaikka LWP::UserAgent tekee tämän, se on parempi heti # Tavallisten tekstimuotoparametrien luominen $field = HTTP::Message->new([ "Content -Disposition" => "form-data; name=" kentän nimi"", "Content-Type" => "teksti/plain; charset=utf-8", ]); # Korvaamme HTTP::Headers-otsikon luodessasi HTTP::Message-objektia $field->add_content_utf8(" jotain arvoa"); # Kuten näette, jonkin arvon täytyy olla UTF-8:ssa $pyyntö->add_part($field); # ... Ja niin edelleen, jokaisessa tekstikentässä... # Lomakkeen binääriparametrien muodostus auki (minun $fh, "<", $file); # А можно сначала сделать заголовок, а потом уже применить к HTTP::Message my $size = (stat $file); my $header = HTTP::Headers->uusi; $header->header("Content-Disposition" => "form-data; name=" tiedosto"; tiedostonimi=" somefile.bin"); # Vaikka tiedostonimi voidaan laskea tiedoston nimestä $header->header("Content-Type" => " sovellus/oktettivirta"); # Tai vastaa tiedostotyyppiä my $file_content = HTTP::Message->new($header); $file_content->add_content($_) while<$fh>;

$pyyntö->lisää_osa($tiedoston_sisältö); sulje $fh; # ... Ja niin edelleen, jokaiselle tiedostolle... my $response = $ua->request($request); if ($response->on_success) ( tulosta $vastaus->sisältö ) else ( die $response->status_line )

Socketin käyttäminen kentän nimi Kaikki olisi hyvin, mutta jos meillä on suuri tiedosto siirrettäväksi, sen lataaminen kokonaan muistiin pyynnön keräämiseksi ei ole paras mahdollinen mahdollisuus. Siksi on mahdollista lähettää pyyntö streamin kautta socketin kautta: Perl-koodi (2) #!/usr/bin/perl use range; käytä varoituksia; käytä HTTP::Headers; käytä HTTP::Message; käytä HTTP::Request; käytä HTTP::Responsea; käytä IO::Socket::INET; # Tämä on tiedosto, joka lähetetään minun $file = "./files/some_file.bin"; # Tämä on URI, johon lähetämme pyynnön my $uri = "http://somedomain.com/form/action/script"; # Koska käytämme socketia, tarvitsemme toimialueen, portin ja polun erikseen my ($domain, $port, $path) = $uri =~ m/^(?:https?\:\/\/)?( [^\/\:]+)(?:\:(\d+))?(.+)$/; $portti ||= 80; # Oletuksena # Pyörä on tietysti hyvä, mutta voit helposti muodostaa otsikot ja ei-binaarisen pyynnön rungon valmiilla moduulilla my $header = HTTP::Headers->new; $header->header("Content-Type" => "moniosainen/lomake-tiedot"); my $request = HTTP::Request->new("POST", $uri, $header); # $polun sijaan meillä on $uri, näin sen pitäisi olla ;-) $request->protocol("HTTP/1.0"); # On outoa, että HTTP::Request ei oletuksena aseta protokollaa, joten asetamme sen itse # Pienille tietomäärille, esimerkiksi tekstikentille, myös polkupyörä on tarpeeton # (SFCI) Ehdot ovat samat kuin edellinen koodi (1) my $ field = HTTP::Message->new([ "Content-Disposition" => "form-data; name=" jotain arvoa"); # Ja tässäkin utf8 $request->add_part($field); # ... Ja niin edelleen, jokaiselle tekstikentälle... # Seuraavaksi jaamme pyyntömme, mutta ilman tiedostoja, pääotsikkoon ja sisällön ensimmäinen osa # Jaamme säännöllisellä lausekkeella, koska $request->headers->as_string ei palauta pyynnön ensimmäistä riviä eli POST-komentoa # ja voit tietysti kerätä rivin itse, mutta olen laiska ($pää, $sisältö) = $pyyntö->merkkijono =~ m/^(.+?)\n\n(.+)$/s sisältö, joten leikataan se pois -- $content = substr($sisältö, 0, -4) sama raja $content =~ s/(\-\-[^\n]+)$//s; raja = $1 # Laske pyynnön alustava pituus minun $pituus = pituus $content # Nyt tiedostomme: minun $tiedostot = minun $f_header = HTTP::Headers->new; ; $f_header->header("Content-Disposition" => "form-data; name=" tiedosto"; tiedostonimi=" somefile.bin"); $f_header->header("Content-Type" => " sovellus/oktettivirta"); $f_header = $raja."\n".$f_header->as_string."\n"; # Lisää pyynnön pituuteen $pituus += pituus $f_header; $length += $koko; # Itse asiassa , menettely on alla vain tapauksissa, joissa tiedostoja on paljon # Sitten meidän on ensin laskettava sisällön pituus, koska se (pituus) ilmoitetaan pääotsikon push @($files), (header => $f_header, file => $file # ... Ja niin edelleen, jokaiselle tiedostolle... # Olemme siis kaikki valmiina $pituus += pituus $raja."--" # Me laske myös loppurivi # Avaa socket my $socket = IO::Socket: :INET->new($domain.":".$port) || die $! # Pääotsikon pituuteen $head .= "\nContent-Length: ".$length # Lähetä otsikko ja ensimmäinen (teksti) osa tulostaa $socket "\n\n" tulosta $socket; tiedosto (@($tiedostot)) ( tulosta $socket $file->(header); (oma $fh, "<", $file->(tiedosto));<$fh>tulosta $socket $_while<$socket>;

Tällä oppitunnilla tarkastellaan tekniikoita tietojen siirtämiseen lomakkeiden ja sivujen välillä. Tällaisia ​​menetelmiä ovat POST ja GET. Puhumme jokaisesta erikseen ja yksityiskohtaisemmin. Yleisesti ottaen tätä tarvitaan lomakkeiden väliseen viestintään. Esimerkiksi täytämme joitain kenttiä sivulla ja meidän on siirrettävä ne toiselle sivulle käsittelyä varten.

GET-menetelmä PHP:ssä

Katsotaanpa ensin GET-menetelmää. Tällöin kaikki muuttujat ja niiden arvot välitetään suoraan osoitteen kautta. Nyt esimerkin avulla näet kaiken ja ymmärrät jopa kuinka useimmat sivustot ja foorumit toimivat.
Meillä on esimerkiksi tällainen html-sivu:

Esimerkkisivu muuttujien välittämisestä Get-komennolla linkki

Katso linkki? Se on monimutkainen ja koostuu useista osista. Puretaan se pala palalta:
https://sivusto— verkkotunnuksen osoite tai, kuten sitä myös kutsutaan, isäntä.
index.php— PHP-sivu, joka käsittelee pyynnön.
? — erotussymboli osoitteen ja muuttujia sisältävän lohkon välillä.
Seuraavaksi tulevat muuttujat ja niiden arvot, jotka erotetaan symbolilla & .
nimi = Sergei— nimimuuttuja ja sen arvo Sergey.
ikä = 22- sama asia, muuttuva ikä, arvo 22.

Olemme selvittäneet kaiken, nyt katsotaan kuinka tämä käsitellään php:ssä GET-menetelmällä.
Kuten muistat, siirryimme index.php-sivulle:

Ensinnäkin neuvo: Tarkista AINA muuttujien oikeellisuus: tyhjyys, kelvollisten arvojen noudattaminen ja niin edelleen. Koska kaikki välitetään osoitepalkin kautta, tiedot voidaan helposti korvata ja vahingoittaa sivustoa. Nyt itse koodiin: tarkistimme sovelluksella nimi- ja ikämuuttujien tyhjyyden ja jos ne eivät olleet tyhjiä, näytimme ne, ja jos ne olivat tyhjiä, ilmoitimme sen.
Se on yksinkertaista, etkö ole samaa mieltä? Voit esimerkiksi luoda html-sivun ja tehdä linkkejä valikon muuttujien kautta ja index.php:ssä käsitellä muuttujaa ja näyttää tietyn sivun vastaanotetun arvon mukaan. Puhumme tästä myöhemmin artikkelissa verkkosivuston luomisesta PHP:llä tyhjästä. Jotta et menetä mitään, suosittelen tilaamaan RSS-palvelun.

POST-menetelmä PHP:ssä

Tämän menetelmän toiminnan osoittamiseksi tarvitsemme hieman enemmän kuin yksinkertaisen rivin osoitteella :) Meidän on luotava HTML-sivu täytettävällä lomakkeella, mutta ei hätää, annan sinulle valmiin esimerkki:

Esimerkkisivu muuttujien välittämisestä Post-toiminnolla

Täytä kentät siirtääksesi tietoja:

Kirjoita nimesi:

Ilmoita ikäsi:



Joten olemme luoneet html-sivun yksinkertaisella lomakkeella. Muista, että POST-menetelmää voidaan käyttää vain lomakkeessa.
Lomakkeen ensimmäinen parametri on "method", se määrittelee menetelmän, jota käytämme siirtoon. Kuten saatat arvata, tämä on joko GET tai POST. Lisäksi, jos GET on asetettu, kaikki kenttien nimet (muuttujien nimien muodossa) sekä niiden arvot välitetään viittauksella, kuten GET-menetelmää käsittelevässä osiossa. Jos POST on asetettu, kaikki muuttujien nimet ja arvot lähetetään selainpyyntönä verkkopalvelimelle. Eli ne eivät näy osoitepalkissa. Monissa tapauksissa tämä on erittäin hyödyllistä. POST on myös turvallisempi, mikä on ymmärrettävää, koska muuttujia arvoineen ei ole enää niin helppo muokata, vaikka sekin on mahdollista.

Toinen lomakeparametri on "toiminta". Tämä on sen komentosarjatiedoston polku ja nimi, johon tiedot välitämme. Meidän tapauksessamme tämä on index.php. Tämä polku voidaan lähettää kokonaisuudessaan, eli näin: action = “https://my_site.ru/index.php”. Jos et määritä "action"-parametrin arvoa, kaikki tiedot siirretään pääskriptiin, eli sivustosi hakemistosivulle index.php, mikä on melko loogista.

Nyt saamme tiedot lomakkeestamme. Koska välitimme sen index.php:lle, alla on tämän sivun koodi:

"; echo "nimi - "; echo $_POST["käyttäjänimi"]; echo "
ikä - "; echo $_POST["ikä"]; echo " vuotta"; ) else ( echo "Muuttujat eivät saapuneet. Tarkista kaikki uudelleen."; ) ?>

Älä unohda tarkistaa tyhjyyttä ja kelvollisia arvoja. Seuraavaksi meidän on selvennettävä, miksi muuttujiamme kutsutaan nimellä user_name ja age? Ja katso yllä luomamme lomakkeen kenttiä. Katso sieltä input name="user_name" type="text"? Tässä parametri nimi määrittää muuttujan nimen, jonka saamme käyttämällä tätä kenttää. Sama on iän kanssa. Toivottavasti asia on selvä. No, muuttujan ja sen arvon saaminen POST:n kautta ei juuri eroa GET:stä, josta keskustelimme edellä.

No, se osoittautui suureksi oppitunniksi, mutta yhdeksi hyödyllisimmistä, koska muuttujien välittäminen lomakkeiden ja sivujen välillä on juuri sitä interaktiivisuutta, johon käytämme PHP:tä.

Olet ehkä huomannut, että useimmilla sivustoilla näet seuraavat osoitteet:

Http://site/index.php?blog=2

Täällä, jopa tuntematta php:tä, voit arvata, että käytämme tiedostoa index.php Mutta harvat tietävät, mitä kysymysmerkin jälkeen tulee. Se on melko yksinkertaista: ?blogi=2 Tämä on globaalin muuttujan "$_GET["blog"] ilmoitus arvolla "2". Siten välitän skriptiin muuttujan, joka vastaa tietokannan tietojen näyttämisestä. Kirjoita pieni käsikirjoitus, jossa näet selvästi kaiken:

if(isset($_GET["blogi"])) (
echo $_GET["blogi"];
}
?>

Käytämme if()-ehtooperaattoria ja seuraavaa riviä käytetään ehtona:

Isset($_GET["blogi"])

isset() antaa sinun selvittää, onko suluissa määritetty muuttuja olemassa, eli koodissa kuvaamani ehto kuulostaa tältä: Jos muuttuja $_GET["blogi"] on olemassa, näytä tämän muuttujan sisältö näytöllä. Tässä on mitä tapahtui:

Mielestäni on selvää, että globaali muuttuja luodaan $_GET osoitepalkissa ilmoittamallamme tunnisteella ( tässä tapauksessa tunnisteella "blogi")

Nyt haluan selventää yhtä asiaa. Oletetaan, että meidän täytyy ilmoittaa kaksi muuttujaa, miten tämä tehdään? Ensimmäinen muuttuja ilmoitetaan kysymysmerkin "?" Toinen muuttuja ilmoitetaan &-merkin jälkeen ( Rehellisesti sanottuna en tiedä mikä tämä merkki on), tässä on esimerkkiilmoitus kolmesta muuttujasta:

Http://site/index.php?a=1&b=2&c=3

Tässä on lähtökoodi:

if(isset($_GET["a"]) AND isset($_GET["b"]) AND isset($_GET["c"])) (
echo $_GET["a"]."
";
echo $_GET["b"]."
";
echo $_GET["c"]."
";
}
?>

Tilanne kuulostaa tältä:

Jos on globaali muuttuja $_GET["a"] ja globaali muuttuja $_GET["b"] ja globaali muuttuja $_GET["c"], näytä ne näytöllä, tässä tulos:

Lomakkeet

Ennen kuin pääsemme lähettää pyyntöjä, sinun on ymmärrettävä, mitä lomakkeet ovat? Miksi se on välttämätöntä? Koska globaali muuttuja $_POST[""] luodaan lomakkeiden kautta. Mikä on muoto? Nämä ovat kenttiä, joihin käyttäjä voi syöttää tietoja. Siellä on yksirivisiä kenttiä, suuria kenttiä sekä valintanappeja ja valintaruutuja. Otetaan kaikki järjestyksessä...

Lomake on tagi:


muotoelementtejä

Lomakkeessa on attribuutteja, luettelen yleisimmät:

Luodaan lomake:


muotoelementtejä

Asetin tiedoston käsittelijätiedostoksi testi.php koska siinä kirjoitan esimerkkejä sinulle. Asetin lähetystavaksi postauksen, koska näitä menetelmiä käytetään 99,9 %:ssa tapauksista. Annoin myös lomakkeellemme nimen - lomakkeen

Sukeltakaamme nyt muotoelementtien maailmaan. Ensimmäinen asia, joka sinun on ymmärrettävä, on, että melkein kaikki elementit ovat tunnisteita ainoa ero on attribuutissa tyyppi näillä tunnisteilla. Haluan luetella käytetyt lomakeelementit:

Olen varma, että olet nähnyt tällaisia ​​kenttiä useammin kuin kerran, joten he sanovat näin: "ei kommentteja"

Tehdään nyt pieni koulutuskysely, jonka kanssa työskentelemme jatkossakin. Tehtävämme on luoda pieni kyselylomake, jossa kerrotaan täyttäjän nimi, sukupuoli, maa, lempiväri ja tekstikenttä, johon käyttäjä voi lisätä jotain itsestään. Tässä mitä sain:

Sukunimesi Etunimi Isännimi:

Sukupuolesi:
M
JA

Mistä maasta olet kotoisin?



Lempivärit:

Musta:
Punainen:
Valkoinen:
Toinen:

Itsestäni:




Huomaa, että melkein jokaisella tunnisteella on attribuutti arvo, mitä varten se on? Se tallentaa tiedot, jotka aiot siirtää toiselle sivulle. Toivottavasti asia on selvä

Jos nyt suoritamme tämän koodin selaimessa, näemme seuraavan:

Lomakkeessa käytin attribuuttia toimintaa merkityksen kanssa testi.php tämä tarkoittaa, kuten jo sanoin, että lomakkeen tiedot siirretään test.php-tiedostoon.

POST-pyyntö

Nyt kirjoitetaan PHP-koodi, jonka avulla voimme nähdä syöttämämme tiedot. Mihin tiedot tallennetaan? Get-pyynnön tapauksessa tietomme olivat globaalissa muuttujassa $_GET[""]. Kun lähetät pyynnön, tiedot tallennetaan globaaliin muuttujaan $_POST[""]. Hakasulkeisiin on kirjoitettava tunniste, kuten globaalin muuttujan get tapauksessa. Kysymys kuuluu, mistä saan tämän tunnisteen? Siksi tarvitsemme lomakeelementtien nimi-attribuutin! Juuri nämä nimet toimivat avaimenamme globaalissa postitaulukossa. No, aloitetaan käsikirjoituksen kuvaaminen:

if(isset($_POST["lähetä"])) (
echo "Koko nimi: ".$_POST["fio"]."
";
echo "Sukupuoli: ".$_POST["sukupuoli"]."
";
echo "Asuinmaa: ".$_POST["kaupunki"]."
";

Echo "Suosikkiväri(t):
";
echo $_POST["väri_1"]."
";
echo $_POST["väri_2"]."
";
echo $_POST["väri_3"]."
";
echo $_POST["väri_4"]."
";
echo "Tietoja itsestäsi: ".$_POST["tietoa"]."


";
}
?>

Kirjoittamamme if-ehto sanoo: Jos on globaali muuttuja $_POST["lähetä"], näytämme tiedot näytöllä. Tämä globaali muuttuja syntyy, kun napsautamme Lähetä-painiketta, minkä vuoksi tässä esimerkissä painikkeessa tarvitaan name-attribuutti. Saatat ihmetellä, miksi painikkeen nimimäärite on valinnainen? Se on melko yksinkertaista. Tyypillisesti ohjelmoija ei valvo painikkeen painallusta, vaan tarkkailee lähetettyä dataa. Esimerkiksi yhteydenottolomakkeen oikeaa toimintaa varten ei tarvitse seurata napin painallusta, vaan syötettyjen tietojen oikeellisuutta ja selvittää, syötettiinkö näitä tietoja ollenkaan. Esimerkissämme emme tarkistaneet lähetettyjä tietoja, vaan seurasimme yksinkertaisesti painikkeen painallusta esimerkin yksinkertaistamiseksi... Saimme tämän:

Johtopäätös

No, tänään tarkastelimme kahta tapaa siirtää tietoja skriptien välillä ja tutustuimme myös lomakkeisiin. Toivon todella, että näistä tiedoista on sinulle hyötyä ainakin jossain. Jos sinulla on kysyttävää tai ajatuksia, kirjoita kommentteja. Onnea sinulle, siinä kaikki tälle päivälle!

P.S.: Haluatko, että tietokonepeleistä tulee entistä realistisempia? Directx 11 for Windows 7 voidaan ladata ilmaiseksi Windows in! Nauti upeasta grafiikasta!