Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Tworzenie `API`, Czyli jak to ugryźć ?
Damiankossek
post
Post #1





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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ą ?

Ten post edytował Damiankossek 14.02.2011, 01:50:39
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
yevaud
post
Post #2





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


xml-rpc
soap
Go to the top of the page
+Quote Post
Damiankossek
post
Post #3





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował Damiankossek 14.02.2011, 13:01:44
Go to the top of the page
+Quote Post
kiler129
post
Post #4





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


fuu ... xml (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)

Dostępne z ręki w JS, PHP i większości języków.
Go to the top of the page
+Quote Post
Damiankossek
post
Post #5





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


A jak przekazać to POSTEM na inny serwer ?(IMG:style_emoticons/default/snitch.gif)

tzn. form z actionem zrobić umiem (IMG:style_emoticons/default/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

Ten post edytował Damiankossek 14.02.2011, 13:39:23
Go to the top of the page
+Quote Post
kiler129
post
Post #6





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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);


Ten post edytował kiler129 14.02.2011, 14:02:20
Go to the top of the page
+Quote Post
Damiankossek
post
Post #7





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


Dzięki za pomoc, wolałbym uniknąć JS (IMG:style_emoticons/default/smile.gif)

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

Dzięki !
Go to the top of the page
+Quote Post
Fifi209
post
Post #8





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


kiler129 - a słyszałeś o .serializeArray() ?
Go to the top of the page
+Quote Post
kiler129
post
Post #9





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Fifi209
post
Post #10





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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...

Ten post edytował fifi209 14.02.2011, 14:32:43
Go to the top of the page
+Quote Post
kiler129
post
Post #11





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Nie, ta funckja robi to samo co serialize() w php (IMG:style_emoticons/default/smile.gif)
Dopiero później można ją JSONować (i wtedy mieć JSON z typami danych).
Go to the top of the page
+Quote Post
Fifi209
post
Post #12





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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>
Go to the top of the page
+Quote Post
#luq
post
Post #13





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Najlepiej zobacz sobie Facebook API (SDK dla PHP) albo jakieś GG API (SDK dla PHP)...
Go to the top of the page
+Quote Post
Damiankossek
post
Post #14





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


Zrobiłem to poprzez CURL + POST i fajnie chodzi (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)

  1. function sayHello($value)
  2. {
  3. print $value;
  4. }
  5.  
  6.  
  7. $sayHello = 'sayHello';
  8.  
  9. $sayHello('jestem kioskiem');


Ten post edytował Damiankossek 14.02.2011, 23:00:38
Go to the top of the page
+Quote Post
kiler129
post
Post #15





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Damiankossek
post
Post #16





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kiler129
post
Post #17





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Coby nie być gołosłownym, niedawno podobny problem miałem: http://forum.php.pl/index.php?showtopic=163369&hl=

Ten post edytował kiler129 15.02.2011, 01:17:58
Go to the top of the page
+Quote Post
greycoffey
post
Post #18





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post
Damiankossek
post
Post #19





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


Słuszna uwaga, lecz zastosowałem call_user_func_array(). Działa OK
Go to the top of the page
+Quote Post
greycoffey
post
Post #20





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Nadal będzie działać to, co wyżej opisałem. Zrób najlepiej tablicę z dozwolonymi metodami i filtruj przez in_array.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 15:39