Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie `API`
Forum PHP.pl > Forum > PHP
Damiankossek
Witam,

Chciałbym sobie zrobić takie API że jak naprzykład na stronie http://klient.pl/ zrobię:

  1. $object -> addMessage("Wiadomość");


To wtedy na serwerze położonym na http://serwer.pl doda mi tą wiadomość do bazy danych smile.gif

Tworzenie klas, dodawanie itp. to nie problem ? Tylko jak przekazać tą wiadomość ? poprzez GET ?

Że wykona mi się np. http://serwer.pl/addMessage/klient.pl/TreśćWiadomości ?

Jeżeli tak to jak to wykonać tak aby móc zwrócić TRUE/FALSE ? file_get_contents(adres) (Tutaj mogę sobie przy okazji zwrócić właśnie wiadomość zserializowaną tablicą a u klienta ją unserializować) ?

Czy takie rzeczy robi się inną metodyką ?
yevaud
xml-rpc
soap
Damiankossek
No właśnie bawię się tym NuSoapem ale mam problem bo za każdym razem do klienta zwraca mi:

Response not of type text/xml: text/html; charset=utf-8

Wydaje mi sie że wszystko mam dobrze, zobaczcie sami:

KLIENT:
  1. <?php
  2.  
  3. require_once('nusoap.php');
  4.  
  5. $wsdl = "http://testlab.hekko.pl/nusoap?wsdl";
  6.  
  7. $client = new nusoap_client($wsdl);
  8.  
  9. $err = $client->getError();
  10.  
  11. if($err)
  12. {
  13. die($err);
  14. }
  15.  
  16. $param = array('value' => 'Zwracana wartosc');
  17.  
  18. $result = $client -> call('returnValue', $param);
  19.  
  20. if($client->getError() != false)
  21. {
  22. die($client->getError());
  23. }
  24.  
  25. echo '<b>'.$result.'</b>';
  26.  


SERVER:
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  
  3. class Controller_nusoap extends Controller {
  4.  
  5. public function before()
  6. {
  7. parent::before();
  8. }
  9.  
  10. public function action_index()
  11. {
  12. require_once('application/classes/model/system/nusoap.php');
  13.  
  14. $ns = 'http://testlab.hekko.pl/nusoap';
  15. $server = new soap_server();
  16. $server -> configureWSDL('Soap Server', $ns);
  17. $server -> wsdl -> schemaTargetNamespace = $ns;
  18.  
  19. $server -> register('returnValue',
  20. array('value' => 'xsd:string'),
  21. array('return' => 'xsd:string'),
  22. $ns,
  23. "$ns#returnValue"
  24. );
  25.  
  26. function returnValue($value)
  27. {
  28. return new soapval('return', 'string', $value);
  29. }
  30.  
  31. $postData = file_get_contents('php://input');
  32.  
  33. $server -> service($postData);
  34. }
  35. }
  36.  



Co może być nie tak ?
kiler129
fuu ... xml biggrin.gif
Nie lepiej przekazywać postem jsonowaną tablicę ze stringiem "command" (czyli np. "addNews") i tablica w drugim kluczu "params" (z danymi)?
Proste, szybkie i dobrze się sprawdza wink.gif

Dostępne z ręki w JS, PHP i większości języków.
Damiankossek
A jak przekazać to POSTEM na inny serwer ?snitch.gif

tzn. form z actionem zrobić umiem smile.gif

W zasadzie zależy mi na tym żeby to było bez zbędnego przeładowywania strony. Bo to ma leżeć w controllerze i poprostu co refresh się wykonywać, user na to wpływu nie ma
kiler129
Javascriptem może jeśli to kliencka app w przeglądarce? W php to najprościej cURL (albo fsockopen).
Kawałe kodu do JS (wymaga jQuery), nieco skróciłem aby nie zamazać obrazu całości zbędnym kodem:

Kod
  function saveNews() {
   if($("#form_news_id").val() == '') { $("#form_news_id").val('0'); } //Add news if id empty - just for 100% sure of id
  
   var id = $("#form_news_id").val();
   var title = $("#form_title").val();
   var content = $("#form_content").val();
   var commentsChBox = $('#comments_checkbox').attr('checked');

  dataForSave = {"command":"saveNews", "params":{"id":id, "title":title, "content":content, "comments_chbox":commentsChBox}};
  
  postJSON("pages/ajax.news.php", dataForSave, function(data) {
    msg_content(data["code"], data["desc"]);
    if(data["data"]=="true") { showFilteredNewsTable(); } //If user can correct produced error do not reaload table
   }, function(data) {
    msg_content("err", "error");
   });
}


funkcja postJSON:
Kod
function postJSON(url, data, ok, err) {
  if(url=="undefined") { alert('Incorrect call to postRequest() - aborting [no url?]'); return false; }
  if(data=="data") { alert('Incorrect call to postRequest() - aborting [no data?]'); return false; }
  if(ok=="undefined") { ok = function(data){return;}; }
  if(err=="undefined") { err = function(){return;}; }
  
  var ok = ok;
  var err = err;
  $.ajax({
           type: 'POST',
           url: url,
           data: {"request":$.toJSON(data)},
           success: ok,
           error: err,
           dataType: "json"
          });
   }


biblioteka implementująca $.toJSON (konwersja tablicy na JSON`a):
Kod
(function($){$.toJSON=function(o)
{if(typeof(JSON)=='object'&&JSON.stringify)
return JSON.stringify(o);var type=typeof(o);if(o===null)
return"null";if(type=="undefined")
return undefined;if(type=="number"||type=="boolean")
return o+"";if(type=="string")
return $.quoteString(o);if(type=='object')
{if(typeof o.toJSON=="function")
return $.toJSON(o.toJSON());if(o.constructor===Date)
{var month=o.getUTCMonth()+1;if(month<10)month='0'+month;var day=o.getUTCDate();if(day<10)day='0'+day;var year=o.getUTCFullYear();var hours=o.getUTCHours();if(hours<10)hours='0'+hours;var minutes=o.getUTCMinutes();if(minutes<10)minutes='0'+minutes;var seconds=o.getUTCSeconds();if(seconds<10)seconds='0'+seconds;var milli=o.getUTCMilliseconds();if(milli<100)milli='0'+milli;if(milli<10)milli='0'+milli;return'"'+year+'-'+month+'-'+day+'T'+
hours+':'+minutes+':'+seconds+'.'+milli+'Z"';}
if(o.constructor===Array)
{var ret=[];for(var i=0;i<o.length;i++)
ret.push($.toJSON(o[i])||"null");return"["+ret.join(",")+"]";}
var pairs=[];for(var k in o){var name;var type=typeof k;if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;if(typeof o[k]=="function")
continue;var val=$.toJSON(o[k]);pairs.push(name+":"+val);}
return"{"+pairs.join(", ")+"}";}};$.evalJSON=function(src)
{if(typeof(JSON)=='object'&&JSON.parse)
return JSON.parse(src);return eval("("+src+")");};$.secureEvalJSON=function(src)
{if(typeof(JSON)=='object'&&JSON.parse)
return JSON.parse(src);var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};$.quoteString=function(string)
{if(string.match(_escapeable))
{return'"'+string.replace(_escapeable,function(a)
{var c=_meta[a];if(typeof c==='string')return c;c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};var _escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var _meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};})(jQuery);
Damiankossek
Dzięki za pomoc, wolałbym uniknąć JS smile.gif

Ale dałeś mi pomysł z cURLem i przekazaniem przez cURL parametrów !

Dzięki !
Fifi209
kiler129 - a słyszałeś o .serializeArray() ?
kiler129
Oczywiście, że słyszałem ale w całym swoim kodzie używam JSON (do cachowania treści również) ponieważ jest szybszy i nie wymusza typów smile.gif
Fifi209
Ale ta funkcja jak czytamy w opisie:
Cytat
The .serializeArray() method creates a JavaScript array of objects, ready to be encoded as a JSON string.


właśnie robi to co chcesz, tak mi się wydaje przynajmniej...
kiler129
Nie, ta funckja robi to samo co serialize() w php smile.gif
Dopiero później można ją JSONować (i wtedy mieć JSON z typami danych).
Fifi209
Tak to jest jak człowiek jest chory i czyta tylko: be encoded as a JSON string ;d

Oczywiście masz rację. Zwracam honor ;]

</offtopic>
#luq
Najlepiej zobacz sobie Facebook API (SDK dla PHP) albo jakieś GG API (SDK dla PHP)...
Damiankossek
Zrobiłem to poprzez CURL + POST i fajnie chodzi smile.gif

Z tym że wiecie może jak zrobić że np robie taką tablicę:

  1. array('sendMessage', 'params' => array('content' => 'tresc wiadomosci'));


I jak po stronie serwera wywołać funkcję tą z tablicy ? Oczywiście mam ją gotową z tym że nie wiem jak wywołać jako funkcję string z tablicy ?

Zostaje tylko porównywanie IFem ?

Mam nadzieje że się dobrze wyraziłem i mnie zrozumiecie :-)

---

Rozwiązanie banalnie proste i działa wink.gif

  1. function sayHello($value)
  2. {
  3. print $value;
  4. }
  5.  
  6.  
  7. $sayHello = 'sayHello';
  8.  
  9. $sayHello('jestem kioskiem');
kiler129
Uważaj z tym!
Różnie działa (a czasami nie działa) na różnych wersjach php. Lepiej użyj http://www.php.net/manual/en/function.call-user-func.php
Damiankossek
Dzięki , tak właśnie myślałem nad tym że mogą być różne konflikty na serverach, skoro to jest prawidłowa metoda to ją zastosuje smile.gif
kiler129
Coby nie być gołosłownym, niedawno podobny problem miałem: http://forum.php.pl/index.php?showtopic=163369&hl=
greycoffey
Uważam lebiej z tym $sayhello($value). Co w wypadku jak ktoś poda $sayhello='file_get_contents'; i $value='jakisplikzhaslamidobazydanych.php'? Bezpieczeństwo przede wszystkim.
Damiankossek
Słuszna uwaga, lecz zastosowałem call_user_func_array(). Działa OK
greycoffey
Nadal będzie działać to, co wyżej opisałem. Zrób najlepiej tablicę z dozwolonymi metodami i filtruj przez in_array.
Crozin
Określenie co powinno być uruchomione (jaka akacja) leży w gestii tzw. routera. A jego temat był już wielokrotnie omawiany na forum.
Damiankossek
Po stronie servera właśnie mam taki Router wink.gif
Funkcje po stronie servera mają prefix sf_

Jeżeli ktoś wpiszę include(); to server sprawdzi najpierw czy istnieje funkcja sf_include() smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.