Skambinkite REST API PHP

Mūsų klientas suteikė man REST API, kuriam reikia skambinti PHP. Tačiau faktiškai su API pateikiami dokumentai yra labai riboti, todėl aš tikrai nežinau, kaip skambinti.

Bandžiau jį naudoti „Google“, tačiau vienintelis dalykas, kuris pasirodė, buvo jau pasibaigęs „Yahoo! apie tai, kaip skambinti paslaugai. Jau nekalbant apie antraštes ar detalesnius.

Ar yra kokia nors tinkama informacija apie tai, kaip paskambinti „REST API“ arba tam tikra dokumentacija? Kadangi net W3schools, jie apibūdina tik SOAP metodą. Kokios yra kitos galimybės sukurti poilsio API PHP?

202
21 марта '12 в 13:33 2012-03-21 13:33 Michielas paklausė kovo 21 d., 12 val. 13:33 2012-03-21 13:33
@ 10 atsakymų

Galite pasiekti bet kurią REST API naudodami PHP cURL plėtinį. Tačiau API dokumentus (metodus, parametrus ir kt.) Turi pateikti klientas!

Pavyzdys:

 // Method: POST, PUT, GET etc // Data: array("param" => "value") ==> index.php?param=value function CallAPI($method, $url, $data = false) { $curl = curl_init(); switch ($method) { case "POST": curl_setopt($curl, CURLOPT_POST, 1); if ($data) curl_setopt($curl, CURLOPT_POSTFIELDS, $data); break; case "PUT": curl_setopt($curl, CURLOPT_PUT, 1); break; default: if ($data) $url = sprintf("%s?%s", $url, http_build_query($data)); } // Optional Authentication: curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLOPT_USERPWD, "username:password"); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); curl_close($curl); return $result; } 
282
21 марта '12 в 13:37 2012-03-21 13:37 Christoph Winkler atsakymas kovo 21 d. 12 val. 13:37 2012-03-21 13:37

Jei turite URL ir jūsų php jį palaiko, galite tiesiog skambinti failo_pasaulio_pavadavimu:

 $response = file_get_contents('http://example.com/path/to/api/call?param1=5'); 

jei $ atsakymas yra JSON, naudokite json_decode, kad įtrauktumėte jį į PHP masyvą:

 $response = json_decode($response); 
border=0

jei $ atsakymas yra XML, naudokite paprastą_pavadinimo klasę:

 $response = new SimpleXMLElement($response); 

http://sg2.php.net/manual/en/simplexml.examples-basic.php

112
21 марта '12 в 13:38 2012-03-21 13:38 atsakymą pateikė Andreas Wong, kovo 21 d., 12:38, 2012-03-21 13:38

Naudokite „ Guzzle“ . Tai „PHP HTTP klientas, kuris supaprastina darbą su HTTP / 1.1 ir pašalina skausmą naudoti žiniatinklio paslaugas“. Darbas su „Guzzle“ yra daug lengviau nei dirbant su „CURL“.

Čia pateikiamas pavyzdys iš svetainės:

 $client = new GuzzleHttp\Client(); $res = $client->get('https://api.github.com/user', [ 'auth' => ['user', 'pass'] ]); echo $res->getStatusCode(); // 200 echo $res->getHeader('content-type'); // 'application/json; charset=utf8' echo $res->getBody(); // {"type":"User"...' var_export($res->json()); // Outputs the JSON decoded data 
95
06 мая '14 в 17:22 2014-05-06 17:22 atsakymas pateikiamas 01-osios gegužės 14 d. 17 val. 2014-05-06 17:22

CURL yra paprasčiausias būdas. Čia yra paprastas skambutis

 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "THE URL TO THE SERVICE"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, POST DATA); $result = curl_exec($ch); print_r($result); curl_close($ch); 
13
21 марта '12 в 13:39 2012-03-21 13:39 atsakymas pateikiamas Broncha kovo 21 d., 12 val. 13:39 2012-03-21 13:39

Naudokite HTTPFUL

„Httpful“ yra paprasta, vientisa, suprantama PHP biblioteka, skirta skirtingai kalbėti. Tai leidžia kūrėjui sutelkti dėmesį į sąveiką su API, o ne atsijoti curl set_opt puslapius ir yra idealus PHP REST klientas.

Įskaičiuota ...

  • Parama skaitomam HTTP metodui (GET, PUT, POST, DELETE, HEAD ir OPTIONS)
  • Individualizuotos antraštės
  • Automatinė „protinga“ analizė
  • Automatinė serijinės serijos apkrova
  • Pagrindinis automatinis nustatymas
  • Kliento pusės kliento sertifikatas
  • Prašyti „šablonų“

Ex.

Siųsti užklausą GET. Gauti automatiškai perskaitytą JSON atsakymą.

Biblioteka JSON Content-Type praneša atsakyme ir automatiškai analizuoja atsakymą į savo PHP objektą.

 $uri = "https://www.googleapis.com/freebase/v1/mqlread?query=%7B%22type%22:%22/music/artist%22%2C%22name%22:%22The%20Dead%20Weather%22%2C%22album%22:%5B%5D%7D"; $response = \Httpful\Request::get($uri)->send(); echo 'The Dead Weather has ' . count($response->body->result->album) . " albums.\n"; 
7
08 дек. Atsakymą pateikė Somnath Muluk 08 dec. 2015-12-08 10:58 '15, 10:58, 2015-12-08 10:58

Turite žinoti, ar REST API, kuriai skambinate, palaiko GET arba POST arba abu. Toliau pateikiamas kodas, kuris veikia man, aš pašaukiu savo interneto paslaugų API, todėl jau žinau, ką veikia API ir ką ji sugrįžta. Jis palaiko GET ir POST metodus, todėl mažiau jautri informacija patenka į URL (GET), o informacija, pvz., Vartotojo vardas ir slaptažodis, pateikiami kaip POST kintamieji. Be to, viskas vyksta pagal protokolą HTTPS.

API kodo viduje aš koduoju masyvą, kurį noriu grįžti į „Json“ formatą, ir tada tiesiog naudokitės PHP komanda echo $ my_json_variable , kad ši juodoji eilutė būtų prieinama klientui.

Taigi, kaip matote, mano API grąžina „Json“ duomenis, bet jums reikia žinoti (arba naršyti grąžintus duomenis, kad sužinotumėte), kokiu formatu API atsakas reaguoja.

Štai kaip aš prisijungiu prie kliento pusės API:

 $processed = FALSE; $ERROR_MESSAGE = ''; // ************* Call API: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.myapi.com/api.php?format=json . $email_to_subscribe); curl_setopt($ch, CURLOPT_POST, 1);// set post data to true curl_setopt($ch, CURLOPT_POSTFIELDS,"username=myname // post data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $json = curl_exec($ch); curl_close ($ch); // returned json string will look like this: {"code":1,"data":"OK"} // "code" may contain an error code and "data" may contain error string instead of "OK" $obj = json_decode($json); if ($obj->{'code'} == '1') { $processed = TRUE; }else{ $ERROR_MESSAGE = $obj->{'data'}; } ... if (!$processed  $ERROR_MESSAGE != '') { echo $ERROR_MESSAGE; } 

Beje, aš taip pat bandžiau naudoti file_get_contents () metodą, nes kai kurie vartotojai pasiūlė čia, bet tai man neveikia. Radau, kad kreivės metodas yra greitesnis ir patikimesnis.

4
02 окт. atsakymas pateikiamas derekg 02 oct. 2014-10-02 22:38 '14, 10:38 pm 2014-10-02 22:38

Iš tiesų yra daug klientų. Vienas iš jų yra Pestas - patikrinkite. Turėkite omenyje, kad šie REST skambučiai yra paprasta HTTP užklausa su įvairiais būdais: GET, POST, PUT ir DELETE.

4
21 марта '12 в 13:40 2012-03-21 13:40 Atsakymas duotas nesuvokusiu kovo 21 d., 12 val. 13.40 2012-03-21 13:40

Jei naudojate simfoniją, yra puikus atostogų kliento paketas, kuris apima visas 100 išimčių ir išmeta jas vietoj to, kad grąžintų prasmės klaidingą kodą +.

Iš tikrųjų turėtumėte tai patikrinti: https://github.com/CircleOfNice/CiRestClientBundle

Man patinka sąsaja:

 try { $restClient = new RestClient(); $response = $restClient->get('http://www.someUrl.com'); $statusCode = $response->getStatusCode(); $content = $response->getContent(); } catch(OperationTimedOutException $e) { // do something } 

Veikia visiems http metodams.

3
07 мая '15 в 22:08 2015-05-07 22:08 atsakymas pateikiamas Tobiasui gegužės 07 d., 15 val. 10:08 val. 2015-05-07 22:08

Galite naudoti file_get_contents grįžti prie bet kokių http metodų POST / PUT / DELETE / OPTIONS / HEAD, be GET metodo, kaip siūlo funkcijų pavadinimas.

Kaip skelbti duomenis php naudojant file_get_contents?

1
06 февр. Atsakymas pateikiamas Chuan Ma 06 Feb. 2013-02-06 18:53 '13, 18:53, 2013-02-06 18:53

Jei esate atviras naudoti trečiosios šalies įrankius, žiūrėkite: https://github.com/CircleOfNice/DoctrineRestDriver

Tai visiškai naujas būdas dirbti su API.

Visų pirma, nustatote objektą, kuris apibrėžia gaunamų ir išeinančių duomenų struktūrą ir komentuoja jį su duomenų šaltiniais:

  class Product { private $name; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } 

Dabar gana paprasta susisiekti su REST API:

 $product = new Product(); $product->setName('test'); // sends an API request POST http://www.myApi.com/products ... $em->persist($product); $em->flush(); $product->setName('newName'); // sends an API request UPDATE http://www.myApi.com/products/update/1 ... $em->flush(); 
1
02 авг. atsakymas duotas Tobias 02 rugpjūčio mėn. 2016-08-02 12:28 '16 at 12:28 2016-08-02 12:28

Kiti klausimai apie žymes arba Užduoti klausimą