Kaip siųsti POST užklausą su PHP?

Tiesą sakant, noriu perskaityti turinį, kuris atsirado po paieškos užklausos, kai jis bus atliktas. Problema ta, kad URL priima tik POST metodus, ir nesiima jokių veiksmų naudodamas GET metodą ...

Turiu perskaityti visą turinį naudojant domdocument arba file_get_contents() . Ar yra kokių nors būdų, leidžiančių siųsti parametrus naudojant POST metodą ir tada perskaityti turinį per PHP ?

566
13 апр. pateikė Fred Tanrikut balandžio 13 d 2011-04-13 13:06 '11, 13:06 pm 2011-04-13 13:06
@ 12 atsakymų

CURL mažiau metodas su PHP5:

 $url = 'http://server.com/path'; $data = array('key1' => 'value1', 'key2' => 'value2'); // use key 'http' even if you send the request to https://... $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); if ($result === FALSE) {  } var_dump($result); 

Daugiau informacijos apie metodus ir būdus, kaip pridėti antraštes, žr. PHP vadovą, pavyzdžiui:

1103
07 июля '11 в 13:27 2011-07-07 13:27 atsakymas pateikiamas dbau liepos 07 d. 11 val. 13:27 2011-07-07 13:27

Galite naudoti CURL:

 <?php //The url you wish to send the POST request to $url = $file_name; //The data you want to send via POST $fields = [ '__VIEWSTATE ' => $state, '__EVENTVALIDATION' => $valid, 'btnSubmit' => 'Submit' ]; //url-ify the data for the POST $fields_string = http_build_query($fields); //open connection $ch = curl_init(); //set the url, number of POST vars, POST data curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); //So that curl_exec returns the contents of the cURL; rather than echoing it curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); //execute post $result = curl_exec($ch); echo $result; ?> 
80
15 апр. Fred Tanrikut atsakymas, pateiktas balandžio 15 d 2011-04-15 15:15 '11, 15:15, 2011-04-15 15:15

Aš naudoju šią funkciją, jei norite skelbti duomenis naudojant garbaną. $ duomenys yra laukų, kuriuos norite skelbti, masyvas (bus teisingai koduojamas naudojant „http_build_query“). Duomenys koduojami naudojant „x-www-form-urlencoded“.

 function httpPost($url, $data) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); curl_close($curl); return $response; } 

@Edward nurodo, kad http_build_query gali būti praleista, nes kreivė teisingai koduos masyvą, perduotą CURLOPT_POSTFIELDS parametrams, tačiau nepamirškite, kad šiuo atveju duomenys bus koduojami naudojant daugiapartinius / formos duomenis.

Aš naudoju šią funkciją su API, kuri tikisi, kad duomenys bus užkoduoti naudojant programą / x-www-form-urlencoded. Štai kodėl naudoju http_build_query ().

51
27 янв. Atsakymą pateikė Dima L. 27 sausis 2016-01-27 22:16 '16 at 22:16 PM 2016-01-27 22:16

Aš rekomenduoju naudoti atviro kodo paketą, kuris buvo visiškai išbandytas ir naudoja naujausius kodavimo metodus.

Įdiekite „guzzle“

Eikite į komandų eilutę projekto aplanke ir įveskite šią komandą (jei jau įdiegėte kompozitoriaus paketo tvarkyklę), jei jums reikia pagalbos diegiant Kompozitorių, turėtumėte ieškoti čia .

 php composer.phar require guzzlehttp/guzzle 

„Guzzle“ naudojimas norint siųsti POST užklausą

„Guzzle“ naudojimas yra labai paprastas, nes juo naudojamas lengvas objekto orientuotas API:

 // Initialize Guzzle client $client = new GuzzleHttp\Client(); // Create a POST request $response = $client->request( 'POST', 'http://example.org/', [ 'form_params' => [ 'key1' => 'value1', 'key2' => 'value2' ] ] ); // Parse the response object, eg read the headers, body, etc. $headers = $response->getHeaders(); $body = $response->getBody(); // Output headers and body for debugging purposes var_dump($headers, $body); 
37
27 апр. Andreas atsakymas balandžio 27 d 2016-04-27 20:23 '16 at 20:23 PM 2016-04-27 20:23

Jei einate tokiu būdu, yra dar vienas CURL metodas.

Tai gana paprasta, kai žinote, kaip veikia „PHP“ pratęsimo plėtinys, derinant įvairias vėliavas su setopt () skambučiais. Šiame pavyzdyje turiu $ xml kintamąjį, kuriame yra XML, kurį paruošiau siuntimui - ketinu paskelbti šio pavyzdžio turinį, pavyzdžiui, su bandymo metodu.

 $url = 'http://api.example.com/services/xmlrpc/'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); //process $response 

Pirmą kartą inicijavome ryšį, tada nustatėme keletą parinkčių naudojant setopt (). Jie pasakoja PHP, kad mes prašome pateikti laišką, ir kad mes siunčiame tam tikrus duomenis, pateikdami duomenis. „CURLOPT_RETURNTRANSFER“ vėliava pasakoja, kad kreivė suteikia mums rezultatą kaip „curl_exec“ grąžinimo vertę, o ne rodyti ją. Tada skambiname ir uždarame ryšį - rezultatą $ atsakyme.

22
15 сент. Josip Ivic atsakymas rugsėjo 15 d 2015-09-15 13:29 '15, 29:29 pm 2015-09-15 13:29

Jei netyčia naudojate „Wordpress“, kad sukurtumėte savo programą (tai tikrai patogus būdas gauti leidimą, informacijos puslapius ir pan., Net ir labai paprastų dalykų atveju), galite naudoti šį fragmentą:

 $response = wp_remote_post( $url, array('body' => $parameters)); if ( is_wp_error( $response ) ) { // $response->get_error_message() } else { // $response['body'] } 

Jis naudoja skirtingus būdus, kaip sukurti faktinį HTTP užklausą, priklausomai nuo to, kas yra žiniatinklio serveryje. Daugiau informacijos ieškokite HTTP API dokumentacijoje.

Jei nenorite sukurti pasirinktos temos ar įskiepio, kad paleistumėte „Wordpress“ variklį, galite paprasčiausiai atlikti šiuos veiksmus WordPress pagrindiniame kataloge:

 require_once( dirname(__FILE__) . '/wp-load.php' ); // ... your code 

Jis nerodys jokios temos ar rodyti jokio HTML kodo, tiesiog nulaužkite „Wordpress“ API!

18
07 окт. atsakymas, kurį pateikė user3638471 Oct 07 2015-10-07 11:05 '15 - 11:05 2015-10-07 11:05

Norėčiau pridurti kai kurias mintis apie Fredo Tanrikuto atsaką. Žinau, kad dauguma jų jau yra užpildyti pirmiau pateiktuose atsakymuose, bet manau, kad tai yra gera idėja parodyti atsakymą, kuriame visi jie kartu.

Čia yra klasė, kurią parašiau, norint įvykdyti garbanos HTTP-GET / POST / PUT / DELETE užklausą tik atsakymo įstaigai:

 class HTTPRequester {  public static function HTTPGet($url, array $params) { $query = http_build_query($params); $ch = curl_init($url.'?'.$query); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $response = curl_exec($ch); curl_close($ch); return $response; }  public static function HTTPPost($url, array $params) { $query = http_build_query($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $query); $response = curl_exec($ch); curl_close($ch); return $response; }  public static function HTTPPut($url, array $params) { $query = \http_build_query($params); $ch = \curl_init(); \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); \curl_setopt($ch, \CURLOPT_HEADER, false); \curl_setopt($ch, \CURLOPT_URL, $url); \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'PUT'); \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query); $response = \curl_exec($ch); \curl_close($ch); return $response; }  public static function HTTPDelete($url, array $params) { $query = \http_build_query($params); $ch = \curl_init(); \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true); \curl_setopt($ch, \CURLOPT_HEADER, false); \curl_setopt($ch, \CURLOPT_URL, $url); \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE'); \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query); $response = \curl_exec($ch); \curl_close($ch); return $response; } } 

patobulinimų

  • Jei norite gauti užklausos eilutę iš užklausų masyvo, naudokite http_build_query (taip pat galite naudoti patį masyvą, todėl žr. Http://php.net/manual/en/function.curl-setopt.php )
  • Grąžinkite atsakymą, o ne pakartokite. Beje, galite išvengti grįžimo ištrindami eilutę curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, tiesa); , Po to grąžinimo reikšmė yra logiška (tiesa = prašymas buvo sėkmingas, kitaip įvyko klaida), ir atsakymas rodomas. Žr. Http://php.net/en/manual/function.curl-exec.php
  • Išvalykite sesijos uždarymą ir garbanos tvarkyklės pašalinimą naudojant curl_close . Žr. Http://php.net/manual/en/function.curl-close.php
  • Naudojant „ curl_setopt“ funkcijos logines reikšmes, o ne naudojant bet kurį numerį (aš žinau, kad bet kuris kitas nei nulis skaičius taip pat laikomas teisingu, bet naudojant tikras sukuria daugiau skaitomo kodo, tačiau tai tik mano nuomonė)
  • Galimybė skambinti HTTP-PUT / DELETE skambučiais (naudinga bandant atnaujinti paslaugą)

Naudojimo pavyzdys

GET

 $response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar")); 

PRANEŠIMAS

 $response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar")); 

NUSTATYTI

 $response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar")); 

Išimkite

 $response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar")); 

bandymai

Taip pat galite atlikti keletą puikių paslaugų testų su šia paprasta klase.

 class HTTPRequesterCase extends TestCase {  public function testHTTPGet() { $requestArr = array("getLicenses" => 1); $url = "http://localhost/project/req/licenseService.php"; $this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]'); }  public function testHTTPPost() { $requestArr = array("addPerson" => array("foo", "bar")); $url = "http://localhost/project/req/personService.php"; $this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]'); }  public function testHTTPPut() { $requestArr = array("updatePerson" => array("foo", "bar")); $url = "http://localhost/project/req/personService.php"; $this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]'); }  public function testHTTPDelete() { $requestArr = array("deletePerson" => array("foo", "bar")); $url = "http://localhost/project/req/personService.php"; $this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]'); } } 
15
03 авг. Atsakymas duotas mwatzer 03 rug . 2017-08-03 23:52 '17, 11:52 pm 2017-08-03 23:52

Kita alternatyva yra iš anksčiau aprašyto kreivumo metodo, jei norite naudoti integruotas srauto funkcijas:

  • stream_context_create() :

    Sukuria ir grąžina siūlų kontekstą su parametrais, pateiktais parametre.

  • stream_get_contents() :

    file_get_contents() , išskyrus tai, kad stream_get_contents() veikia su jau atidarytu srauto ištekliu ir grąžina likusį turinį eilutėje, iki maksimalaus ilgio baitų ir pradedant nuo nurodyto poslinkio.

POST funkcija gali būti tokia:

 <?php function post_request($url, array $params) { $query_content = http_build_query($params); $fp = fopen($url, 'r', FALSE, // do not use_include_path stream_context_create([ 'http' => [ 'header' => [ // header array does not need '\r\n' 'Content-type: application/x-www-form-urlencoded', 'Content-Length: ' . strlen($query_content) ], 'method' => 'POST', 'content' => $query_content ] ])); if ($fp === FALSE) { fclose($fp); return json_encode(['error' => 'Failed to get contents...']); } $result = stream_get_contents($fp); // no maxlength/offset fclose($fp); return $result; } 
10
20 апр. Atsakymas pateikiamas CPHPython balandžio 20 d 2018-04-20 13:05 '18, 13:05 val. 2018-04-20 13:05

Ieškojau panašios problemos ir suradau geriausią būdą tai padaryti. Taigi, čia.

Jūs galite tiesiog įterpti šią eilutę į peradresavimo puslapį (pvz., Page1.php).

 header("Location: URL", TRUE, 307); // Replace URL with to be redirected URL, eg final.php 

Man reikia, kad peradresuotų POST užklausas REST API skambučiams. Šis sprendimas gali perorientuoti tiek po duomenų, tiek su pasirinktomis antraštėmis.

Čia yra nuorodos nuoroda .

5
22 дек. Atsakymą pateikė Arindam Nayak gruodžio 22 d. 2015-12-22 09:02 '15 at 9:02 am 2015-12-22 09:02

Ar yra dar vienas, kurį galite naudoti

 <?php $fields = array( 'name' => 'mike', 'pass' => 'se_ret' ); $files = array( array( 'name' => 'uimg', 'type' => 'image/jpeg', 'file' => './profile.jpg', ) ); $response = http_post_fields("http://www.example.com/", $fields, $files); ?> 

Norėdami gauti daugiau informacijos, spustelėkite čia.

4
05 окт. Atsakymas duotas Kodas Oct 05. 2015-10-05 11:27 '15, 11:27, 2015-10-05 11:27

Pabandykite PEAR HTTP_Request2 paketą, kad galėtumėte lengvai siųsti POST užklausas. Be to, galite naudoti PHP garbanojimo funkcijas arba naudoti PHP konteksto srautą.

HTTP_Request2 taip pat leidžia jums išbandyti serverį, todėl galite lengvai išbandyti savo kodą

1
13 апр. atsakymas duotas cweiske balandžio 13 d 2011-04-13 13:55 '11 at 13:55 pm 2011-04-13 13:55

Geriausias būdas siųsti GET arba POST užklausas naudojant PHP :

 <?php $r = new HttpRequest('http://example.com/form.php', HttpRequest::METH_POST); $r->setOptions(array('cookies' => array('> 

Kodas paimtas iš oficialių dokumentų čia http://php.net/manual/it/httprequest.send.php

0
19 дек. Atsakymas pateikiamas Imran Zahoor 19 d. 2018-12-19 08:34 '18, 8:34 am 2018-12-19 08:34

Kiti klausimai apie žymes arba Ask a question