Forum forumweb.pl Strona Główna  
Oficjalne forum serwisu: kurshtml.boo.pl
Konkurs
Konkurs
   Regulamin
Regulamin
   FAQ
FAQ
   Szukaj
Szukaj
   Użytkownicy
Użytkownicy
   Grupy
Grupy
   IRC/czat
IRC/czat
   Facebook
Facebook
   Rejestracja
Rejestracja
 
Zmień swój profil  ::  Zaloguj się, by sprawdzić wiadomości  ::  Zaloguj



Zobacz następny temat
Zobacz poprzedni temat
Odpowiedz do tematu  Forum forumweb.pl Strona Główna » forumweb.pl
Autor Wiadomość
kurshtml
Administrator
kurshtml

Płeć: Mężczyzna
Wiek: 30
Dołączył(a): 02 Mar 2004
Posty: 4462
Pomocy: 44
Post Wysłany: 06.08.2009 00:03
ForumwebAPI
Zacytuj zaznaczone   ^

Miło mi poinformować, że nasze forum właśnie szerzej otwiera się na świat. A to za sprawą udostępnienia platformy API, za pomocą której każdy programista czy webmaster, przy odrobinie dobrych chęci, będzie mógł odczytać zdalnie pewne udostępnione dane z forum i wyświetlić je w zewnętrznej aplikacji lub na swojej stronie internetowej - w postaci tzw. widżetów. Można je tworzyć za pomocą nieskomplikowanego kodu JavaScript i osadzić np. na własnym blogu wycinek swoich danych profilowych udostępnionych na forum. Możliwości wykorzystania API zależą praktycznie tylko od wyobraźni twórców takich widżetów!

Przykład

Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<!DOCTYPE html
    
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<
title>ForumwebAPI</title>
<
style type="text/css">
/* <![CDATA[ */
#forumweb {
    
font: 12px Arial, Helvetica, sans-serif;
    
float: left;
    
padding: 10px;
    
color: #5E7388;
    
background: #E4E8EC;
    
border: 3px double #9BABBA;
    
width: 250px;
}
#forumweb a {
    
font-weight: bold;
    
font-size: 18px;
    
color: #5E7388;
}
#forumweb a:hover {
    
color: #0E7398;
}
#forumweb img {
    
float: left;
    
margin-right: 10px;
    
border: 0;
}
#forumweb dt {
    
float: left;
    
margin-right: 1ex;
    
font-weight: bold;
}
#forumweb dd {
    
margin: 0;
    
padding: 0;
}
/* ]]> */
</style>
<
script type="text/javascript" src="http://www.forumweb.pl/api/jhr.js"></script>
</
head>
<
body>

<
div id="forumweb"></div>
<
script type="text/javascript">
// <![CDATA[
function parseTemplate(html, data)
{
    for (var
key in data)
    {
        if (
typeof data[key] != 'function') html = '' + data[key] == '' ? html.replace(new RegExp('<!--' + key + '\\?-->.+<!--/' + key + '\\?-->', 'g'), '') : html.replace(new RegExp('<!--' + key + '-->', 'g'), data[key]);
    }
    return
html;
}

var
jhr = new JSONHttpRequest('iso-8859-2', 30000);
jhr.onreadystatechange = function()
{
    if (
jhr.readyState == 4) document.getElementById('forumweb').innerHTML = jhr.status != 200 || typeof jhr.responseJSON['users'] == 'undefined' ? 'Niestety nie udało się pobrać danych' : parseTemplate('<!--user_avatar?--><a href="<!--uri-->"><img src="<!--user_avatar-->" alt="<!--username-->" /></a><!--/user_avatar?--><a href="<!--uri-->"><!--username--></a><dl><dt>Postów:</dt><dd><!--user_posts--></dd><dt>Pomocy:</dt><dd><!--user_helps--></dd></dl>', jhr.responseJSON['users'][0]);
};
jhr.open('GET', 'http://www.forumweb.pl/api/users/get.js?user_id=2');
jhr.send();
// ]]>
</script>

</
body>
</
html>


JSONHttpRequest

Jedną z najprostszych metod używania API, jest wykorzystanie w JavaScript specjanie przygotowanej w tym celu biblioteki - cross domenowy AJAX. Dane w formacie JSON są pobierane bezpośrednio z forum za pomocą wywołań asynchronicznych. Różnica między tradycyjnym AJAX-em jest taka, że AJAX pozwala pobierać dane tylko z tej samej domeny, z której został wywołany. Proponowana klasa JSONHttpRequest nie posiada tej wady, a udostępnia interfejs niemal identyczny jak standardowy XMLHttpRequest, więc jej używanie powinno być intuicyjne dla każdego, kto kiedykolwiek implementował jakiś skrypt z wykorzystaniem AJAX-a. Niestety biblioteka ta ma również pewne ograniczenia:
  • Nie pozwala wykonywać zapytań synchronicznych (w zasadzie to nie wada)
  • Nie obsługuje metody POST, a jedynie GET
  • Nie pozwala wysyłać ani odczytywać żadnych nagłówków HTTP
  • W przypadku wystąpienia błędu, nie zwraca wysłanych przez serwer kodów statusu odpowiedzi HTTP
  • Nie obsługuje XML (responseXML), ale za to domyślnym formatem wymiany danych jest wygodny JSON (responseJSON)


API

Udostępnione na forum API opiera się na wzorcu REST, który w odróżnieniu np. od SOAP jest znacznie łatwiejszy i przyjemniejszy w użyciu, a dodatkowo zawiera szereg innych zalet. Wszystkie udostępnione funkcjonalności są podzielone na klasy, które z kolei zawierają metody - jak w programowaniu zorientowanym obiektowo. Aby wywołać jakąś metodę obiektu REST, wystarczy po prostu odwołać się do z góry określonego adresu URL na forum, który udostępnia API. Idea wykorzystania API jest następująca:
  1. Na swojej stronie, za pomocą klasy JSONHttpRequest wywołujemy odpowiedni, specjalnie udostępniony adres URL z API na forum
  2. Odbieramy dane
  3. Dynamicznie, za pomocą JavaScript, wklejamy je gdzieś do dokumentu (X)HTML, np. za pomocą innerHTML

Nawiązaznie połączenia i odebranie danych odbywa się praktycznie tak samo, jak w przypadku tradycyjnego AJAX-a - pełny przykład znajduje się w kodzie powyżej.

Skąd wziąć adresy udostępnionych funkcjonalności? Pełen spis dostępnych klas i ich metod, wraz z opisami, znajduje się pod adresem http://www.forumweb.pl/api/services.html. Możemy tam znaleźć np. klasę "users" z metodą "get", do wywołania której jak widać adres jest następujący: http://www.forumweb.pl/api/users/get.js (fragment <format> w podanych adresach URI zamieniamy zawsze na "js" - co stanowi po prostu rozszerzenie nazwy pliku API). Jeśli chcemy wywołać metodę z określonymi parametrami, po prostu podajemy je w adresie po pytajniku - np. http://www.forumweb.pl/api/users/get.js?user_id=2. Do celów testowych można również otworzyć sobie w przeglądarce najpierw format "xml", na którym lepiej widać, jaka będzie struktura odpowiedzi (klasa JSONHttpRequest obsługuje wyłącznie format "js"!) - np. http://www.forumweb.pl/api/users/get.xml?user_id=2.

Obsługa błędów

Kiedy coś pójdzie nie tak, zamiast spodziewanych danych w odpowiedzi dostaniemy komunikat błędu w postaci:
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
{
    
"errors": [
        {
            
"code": 404,
            
"status": "CLASS_NOT_FOUND",
            
"message": "Class not found"
        
}
    ]
}

co odpowiada:
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<result version="1.0">
    <
errors>
        <
error>
            <
code>404</code>
            <
status>CLASS_NOT_FOUND</status>
            <
message>Class not found</message>
        </
error>
    </
errors>
</
result>

Możliwe statusy błędów:
  • UNKNOWN_FORMAT - wybrano nieznany format odpowiedzi
  • CLASS_NOT_FOUND - żądana klasa nie została znaleziona
  • METHOD_NOT_FOUND - żądana metoda nie została znaleziona
  • INVALID_DATA - błąd przetwarzania formatu wyjściowego
  • OBJECT_NOT_FOUND - żądany obiekt nie został znaleziony
  • DB_ERROR - błąd bazy danych


Rozwój

  • W przyszłości planowane jest stałe powiększanie dostępnych w API klas i metod - mile widziane wszelkie propozycje.
  • Jak pokazałem na przykładzie, stworzenie własnego widżetu, korzystającego z ForumwebAPI, jest niemal dziecinnie proste. Byłoby cudownie, gdyby ten temat stał się takim repozytorium widżetów, gdzie twórcy mogliby się nimi pochwalić, a inni użytkownicy bez przeszkód wstawiać je na własnych stronach.
  • API REST można używać również z poziomu PHP. Są dostępne darmowe doskonałe biblioteki - np. w Zend Framework. Idealnym formatem do wykorzystania w PHP, będzie oczywiście zserializowany kod PHP - np. http://www.forumweb.pl/api/users/get.php?user_id=2. Być może kiedyś zamieszczę tutaj przykład prostego klienta REST w PHP, który pozwoli pobrać dane w tle i np. zapisać w lokalnej bazie danych lub wykonać na nich jeszcze inne operacje.
  • Początkowo nie będą udostępnione metody API, które mogą modyfikować bazę danych forum lub wymagać logowania, ale w przyszłości - kto wie.

Tymczasem życzę miłego "widżetowania" Smile
 

_________________
stop-ie6.png
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x800
kurshtml
Administrator
kurshtml

Płeć: Mężczyzna
Wiek: 30
Dołączył(a): 02 Mar 2004
Posty: 4462
Pomocy: 44
Post Wysłany: 30.08.2009 14:16
Zacytuj zaznaczone   ^

Na marginesie: w ForumwebAPI jest obecnie możliwość pobierania wyników wywołania dowolnej dostępnej metody w formacie RSS - np.: Najbardziej pomocne posty. Myślę, że ciekawe rezultaty można będzie uzyskać zwłaszcza za pomocą metody _services/get, która pozwala w jednym zapytaniu zgrupować wyniki wywołania kilku metod - np.: Obserwuj nowe posty z wybranych tematów, Obserwuj nowe tematy i nowych użytkowników.
 

_________________
stop-ie6.png
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x800
Emdek
Recenzent
Emdek

Płeć: Mężczyzna
Wiek: 23
Dołączył(a): 30 Sie 2004
Posty: 2199
Pomocy: 6
Skąd: Kleczew
Post Wysłany: 30.08.2009 18:47
Zacytuj zaznaczone   ^

Nie przyglądałem się jakoś specjalnie temu API, ale jeśli daje już te lub zbliżone możliwości, to może warto by to jakoś wypromować przez automatyczne generowanie odnośników do kanałów w odpowiednich miejscach, tak żeby ułatwić ludziom życie. Wink

Chociaż osobiście najbardziej podoba mi się idea pojedynczego zbiorczego kanału ze wszystkimi tematami, w których się kiedykolwiek wypowiedzieliśmy.
 

_________________
Nadszedł już czas, najwyższy czas, nienawiść zniszczyć w sobie.
operalove5vm.gif
Studia...
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x1024
jsmp
Recenzent
jsmp

Płeć: Mężczyzna
Wiek: 21
Dołączył(a): 15 Paź 2006
Posty: 3955
Pomocy: 147
Post Wysłany: 30.08.2009 19:16
Zacytuj zaznaczone   ^

Emdek wogóle warto promować API, bo szczerze samo stworzenie API nic nie daje. Jedynie produkt promowany - pokazywany jak działa to tu to tam - będzie mógł kogoś zainteresować do tego, by sam stworzył jakieś z niego narzędzie.

Sam fakt pojawienia się API był miłym zaskoczeniem, ale szczerze nie zachwycił. Zaczął jednak interesować, kiedy logeen pokazał choć trochę jego możliwości: aktywni, punktowane posty (jak dzisiaj).
 

_________________
Pozycjonowanie strony - jak zdobyć najlepsze pozycje w wyszukiwarkach!

Specjalista ds. marketingu internetowego [zobacz certyfikat]
  
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora  
Numer Gadu-Gadu
5103910
 
 
 
 
 
Skype
 
FirefoxWinXP1024x768
Emdek
Recenzent
Emdek

Płeć: Mężczyzna
Wiek: 23
Dołączył(a): 30 Sie 2004
Posty: 2199
Pomocy: 6
Skąd: Kleczew
Post Wysłany: 30.08.2009 19:26
Zacytuj zaznaczone   ^

jsmp, pewnie, przydałoby się kilka przykładów i opisów możliwości, tylko ktoś musi napisać dokumentację. Wink
 

_________________
Nadszedł już czas, najwyższy czas, nienawiść zniszczyć w sobie.
operalove5vm.gif
Studia...
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x1024
kurshtml
Administrator
kurshtml

Płeć: Mężczyzna
Wiek: 30
Dołączył(a): 02 Mar 2004
Posty: 4462
Pomocy: 44
Post Wysłany: 30.08.2009 21:20
Zacytuj zaznaczone   ^

Może się wydawać, że te materiały to niewiele, ale w tym nie ma dużej filozofii - to naprawdę jest takie proste Smile Napisanie nieskomplikowanego widżeciku w JavaScript na swoją stronę WWW to kilkanaście minut pracy, a to jest tylko jedno z wielu możliwych zastosowań API.

A oto kolejny ciekawy przykład wykorzystania ForumwebAPI - bardzo lekka przeglądarka tematów na forum:
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<!DOCTYPE html
    
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<
title>www.forumweb.pl - Przyjazne forum webmasterskie</title>
<
link rel="stylesheet" href="http://www.forumweb.pl/templates/phpbbSilver/phpbbSilver.css" />
<
script type="text/javascript" src="http://www.forumweb.pl/api/jhr.js"></script>
<
script type="text/javascript">
// <![CDATA[
function Forum(element, charset, timeout)
{
    var
TOPICS_PER_PAGE = 30;
    
    function
checkValid(jhr, key)
    {
        if (
jhr.status != 200 || typeof key != 'undefined' && typeof jhr.responseJSON[key] == 'undefined')
        {
            
element.innerHTML = 'Niestety nie udało się pobrać danych!';
            return
false;
        }
        return
true;
    }
    
    function
generatePagination(start, total, href, onclick)
    {
        function
generatePaginationLink(start, text)
        {
            return
'<a href="' + href + start + '" onclick="' + onclick.replace(/<!--\s*#\s*-->/g, start) + '; return false">' + (typeof text == 'undefined' ? Math.ceil((start + TOPICS_PER_PAGE) / TOPICS_PER_PAGE) : text) + '</a>';
        
}
        if (
total <= TOPICS_PER_PAGE) return '';
        var
html = '<div class="nav">Idź do strony: ';
        if (
start >= TOPICS_PER_PAGE) html += generatePaginationLink(start - TOPICS_PER_PAGE, 'Poprzednia') + ' ';
        if (
start >= 3 * TOPICS_PER_PAGE) html += generatePaginationLink(0) + ' ... ';
        for (var
i = Math.max(0, start - 3 * TOPICS_PER_PAGE), i_ = Math.min(total, start + 3 * TOPICS_PER_PAGE); i < i_; i += TOPICS_PER_PAGE)
        {
            
html += (i == start ? Math.ceil((start + TOPICS_PER_PAGE) / TOPICS_PER_PAGE) : generatePaginationLink(i)) + ' ';
        }
        if (
start < total - 3 * TOPICS_PER_PAGE) html += '... ' + generatePaginationLink(total - TOPICS_PER_PAGE);
        if (
start < total - TOPICS_PER_PAGE) html += ' ' + generatePaginationLink(start + TOPICS_PER_PAGE, 'Następna');
        
html += '</div>';
        return
html;
    }
    
    
this.getForums = function(cat_id)
    {
        
element.innerHTML = 'Proszę czekać...';
        var
jhr = new JSONHttpRequest(charset, timeout);
        
jhr.onreadystatechange = function()
        {
            if (
jhr.readyState != 4 || !checkValid(jhr, 'forums')) return;
            var
html =
                
'<h1><a href="http://www.forumweb.pl" class="maintitle" onclick="Forum._[' + _ + '].getForums(); return false">Strona główna</a></h1>' +
                
'<table class="forumline">' +
                
'<tr><th>Forum</th><th>Tematy</th><th>Posty</th></tr>';
            for (var
i = 0, cat_id = 0; i < jhr.responseJSON['forums'].length; i++)
            {
                if (
jhr.responseJSON['forums'][i]['category']['cat_id'] != cat_id) html += '<tr><td colspan="3" class="catleft"><a href="' + jhr.responseJSON['forums'][i]['category']['uri'] + '" class="cattitle" onclick="Forum._[' + _ + '].getForums(' + jhr.responseJSON['forums'][i]['category']['cat_id'] + '); return false">' + jhr.responseJSON['forums'][i]['category']['cat_title'] + '</a></td></tr>';
                
html +=
                    
'<tr>' +
                        
'<td class="row1"><a href="' + jhr.responseJSON['forums'][i]['uri'] + '" class="forumlink" onclick="Forum._[' + _ + '].getTopics(' + jhr.responseJSON['forums'][i]['forum_id'] + '); return false">' + jhr.responseJSON['forums'][i]['forum_name'] + '</a><div>' + jhr.responseJSON['forums'][i]['forum_desc'] + '</div></td>' +
                        
'<td class="row2">' + jhr.responseJSON['forums'][i]['forum_topics'] + '</td>' +
                        
'<td class="row2">' + jhr.responseJSON['forums'][i]['forum_posts'] + '</td>' +
                    
'</tr>';
                    
cat_id = jhr.responseJSON['forums'][i]['category']['cat_id'];
            }
            
html += '</table>';
            
element.innerHTML = html;
        };
        
jhr.open('GET', 'http://www.forumweb.pl/api/forums/get_list.js' + (typeof cat_id == 'undefined' ? '' : '?cat_id=' + cat_id));
        
jhr.send();
    };
    
    
this.getTopics = function(forum_id, start)
    {
        if (
typeof start == 'undefined') start = 0;
        
element.innerHTML = 'Proszę czekać...';
        var
jhr = new JSONHttpRequest(charset, timeout);
        
jhr.onreadystatechange = function()
        {
            if (
jhr.readyState != 4 || !checkValid(jhr, 'topics')) return;
            var
pagination = generatePagination(start, jhr.responseJSON['topics']['total'], 'http://www.forumweb.pl/viewforum.php?f' + forum_id + '&start=', 'Forum._[' + _ + '].getTopics(' + forum_id + ', <!--#-->)');
            var
html =
                
'<h1><a href="http://www.forumweb.pl" class="maintitle" onclick="Forum._[' + _ + '].getForums(); return false">Strona główna</a></h1>' +
                (
jhr.responseJSON['topics']['resources'].length > 0 ? '<h2><a href="' + jhr.responseJSON['topics']['resources'][0]['forum']['uri']  + '" class="subtitle" onclick="Forum._[' + _ + '].getTopics(' + jhr.responseJSON['topics']['resources'][0]['forum']['forum_id'] + '); return false">' + jhr.responseJSON['topics']['resources'][0]['forum']['forum_name'] + '</a></h2>' : '') +
                
pagination +
                
'<table class="forumline">' +
                
'<tr><th>Tematy</th><th>Odpowiedzi</th><th>Autor</th><th>Wyświetleń</th></tr>';
            for (var
i = 0; i < jhr.responseJSON['topics']['resources'].length; i++)
            {
                
html +=
                    
'<tr>' +
                        
'<td class="row1"><a href="' + jhr.responseJSON['topics']['resources'][i]['uri'] + '" class="topictitle">' + jhr.responseJSON['topics']['resources'][i]['topic_title'] + '</a></td>' +
                        
'<td class="row2">' + jhr.responseJSON['topics']['resources'][i]['topic_replies'] + '</td>' +
                        
'<td class="row3">' + jhr.responseJSON['topics']['resources'][i]['topic_time'] + '<div>' + (typeof jhr.responseJSON['topics']['resources'][i]['user'] == 'undefined' || typeof jhr.responseJSON['topics']['resources'][i]['user']['uri'] == 'undefined' ? 'Gość' : '<a href="' + jhr.responseJSON['topics']['resources'][i]['user']['uri'] + '">' + jhr.responseJSON['topics']['resources'][i]['user']['username'] + '</a>') + '</div></td>' +
                        
'<td class="row2">' + jhr.responseJSON['topics']['resources'][i]['topic_views'] + '</td>' +
                    
'</tr>';
            }
            
html +=
                
'</table>' +
                
pagination;
            
element.innerHTML = html;
        };
        
jhr.open('GET', 'http://www.forumweb.pl/api/topics/get_list.js?mode=post_time&forum_id=' + forum_id + '&start=' + start + '&limit=' + TOPICS_PER_PAGE);
        
jhr.send();
    };
    
    var
_ = Forum._.length;
    
Forum._[_] = this;
}

Forum._ = [];
// ]]>
</script>
</
head>
<
body>

<
div id="forumweb"></div>
<
script type="text/javascript">
// <![CDATA[
var forum = new Forum(document.getElementById('forumweb'), 'iso-8859-2', 30000);
forum.getForums();
// ]]>
</script>

</
body>
</
html>

Nic nie stoi na przeszkodzie, aby napisać taką aplikację w języku Java, C++ czy C#, która będzie działać w ten sam sposób, wykorzystując XML jako format pobierania danych za pośrednictwem API. Forumweb jako aplikacja okienkowa - czemu nie Smile
 

_________________
stop-ie6.png


Ostatnio zmieniony przez kurshtml dnia 31.08.2009 19:07, w całości zmieniany 1 raz
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x800
Emdek
Recenzent
Emdek

Płeć: Mężczyzna
Wiek: 23
Dołączył(a): 30 Sie 2004
Posty: 2199
Pomocy: 6
Skąd: Kleczew
Post Wysłany: 30.08.2009 23:09
Zacytuj zaznaczone   ^

kurshtml, jest jakiś błąd w tym przykładzie chyba, pokazuje tą samą liczbę w kolumnie postów i tematów. A przykład bardzo ciekawy. Wink

Pięć lat na forum, czas szybko leci... Very Happy
 

_________________
Nadszedł już czas, najwyższy czas, nienawiść zniszczyć w sobie.
operalove5vm.gif
Studia...
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x1024
jsmp
Recenzent
jsmp

Płeć: Mężczyzna
Wiek: 21
Dołączył(a): 15 Paź 2006
Posty: 3955
Pomocy: 147
Post Wysłany: 30.08.2009 23:37
Zacytuj zaznaczone   ^

kurshtml napisał(a):
widżeciku w JavaScript

Szkoda, I hate JS Very Happy pomimo, że to dwie pierwsze litery mojego nicka Very Happy cóż pozory mylą Wink Nie zdecydowanie JS to nie dla mnie Very Happy
 

_________________
Pozycjonowanie strony - jak zdobyć najlepsze pozycje w wyszukiwarkach!

Specjalista ds. marketingu internetowego [zobacz certyfikat]
  
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora  
Numer Gadu-Gadu
5103910
 
 
 
 
 
Skype
 
FirefoxWinXP1024x768
kurshtml
Administrator
kurshtml

Płeć: Mężczyzna
Wiek: 30
Dołączył(a): 02 Mar 2004
Posty: 4462
Pomocy: 44
Post Wysłany: 31.08.2009 19:19
Zacytuj zaznaczone   ^

Właśnie chodzi o to, że wcale nie trzeba korzystać z JavaScript. Widżet na stronie głównej Kursu, który wyświetla najaktywniejszych użytkowników, został napisany w PHP - za pomocą ForumwebAPI skrypt PHP okresowo pobiera dane w formacie ".php". Bez trudu można wykorzystać format ".xml" w aplikacjach napisanych w języku: Java, C/C++, C#, Visual Basic, Delphi/Object Pascal i innych. JS to tylko jedna z możliwości.
 

_________________
stop-ie6.png
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x800
jsmp
Recenzent
jsmp

Płeć: Mężczyzna
Wiek: 21
Dołączył(a): 15 Paź 2006
Posty: 3955
Pomocy: 147
Post Wysłany: 01.09.2009 00:42
Zacytuj zaznaczone   ^

---------- 22:16 31.08.2009 ----------

kurshtml to mnie zachęciło do zgłębienia tego cacka Very Happy choć nie wiem, do czego by go narazie wykorzystać Wink
muszę się zagłębić w tematykę parsowania xml'a w php, żeby coś z tego wycisnąć Razz

---------- 00:42 01.09.2009 ----------

Wiem, że niektórym najtrudniej zacząć. Więc prezentuje pierwszy "obrabiacz" tego API. Kod generuje listę 10 najaktywniejszych w php, czyli w sumie coś co już jest na stronie kursu, jednak może przyda się komuś na stronę internetową Smile

Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<?php

$doc
= new DOMDocument('1.0', 'UTF-8');
$doc->load('http://www.forumweb.pl/api/users/get_top_10.xml');
$username = $doc->getElementsByTagName('username');
$uri = $doc->getElementsByTagName('uri');
for(
$i = 0; $i < $username->length; ++$i)
{
  echo
'<a href="'.$uri->item($i)->nodeValue.'" >'.$username->item($i)->nodeValue.'</a><br/>';
};
?>

Jako adres dokumentu można załadować http://www.forumweb.pl/api/users/get_online.xml, dzięki czemu zamiast aktywnych otrzymamy listę userów online Smile

mam nadzieję, że komuś oprócz mnie się to przyda, żeby wykminić jakiś widget Very Happy
 

_________________
Pozycjonowanie strony - jak zdobyć najlepsze pozycje w wyszukiwarkach!

Specjalista ds. marketingu internetowego [zobacz certyfikat]
  
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora  
Numer Gadu-Gadu
5103910
 
 
 
 
 
Skype
 
FirefoxWinXP1024x768
kurshtml
Administrator
kurshtml

Płeć: Mężczyzna
Wiek: 30
Dołączył(a): 02 Mar 2004
Posty: 4462
Pomocy: 44
Post Wysłany: 01.09.2009 01:00
Zacytuj zaznaczone   ^

W PHP chyba najlepiej skorzystać z formatu ".php". Wtedy nie trzeba nic parsować tylko po prostu odserializować pobrane dane. Przykład:
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<?php
/**
 * @version 1.0.2
 * @author Sławomir Kokłowski {@link http://www.kurshtml.boo.pl}
 * @copyright NIE usuwaj tego komentarza! (Do NOT remove this comment!)
 */

class HttpRequest
{
    public
$responseText;
    public
$status;
    public
$statusText;
    
    private
$sock;
    private
$timeout;
    private
$method;
    private
$url;
    private
$requestHeaders = '';
    private
$responseHeaders = array();
    
    function
__construct($timeout=30)
    {
        
$this->timeout = $timeout;
    }
    
    function
open($method, $url)
    {
        
$this->method = $method;
        
$this->url = @ parse_url($url);
        if (
$this->url === false) throw new Exception('Invalid URL format');
        
$this->sock = @ fsockopen($this->url['host'], array_key_exists('port', $this->url) ? $this->url['port'] : 80, $errno, $errstr, $this->timeout);
        if (!
$this->sock) throw new Exception($errstr, $errno);
    }
    
    function
setRequestHeader($name, $value)
    {
        
$this->requestHeaders .= "$name: $value\r\n";
    }
    
    function
send($data='')
    {
        if (
$this->sock)
        {
            
fwrite($this->sock,
                
trim(strToUpper($this->method)) . " " . (array_key_exists('path', $this->url) ? $this->url['path'] : "") . (array_key_exists('query', $this->url) ? "?{$this->url['query']}" : "") . " HTTP/1.1\r\n" .
                
"Host: {$this->url['host']}\r\n" .
                
$this->requestHeaders .
                
"Connection: Close\r\n\r\n" .
                
$data
            
);
            
            
$this->responseText = '';
            
$this->status = null;
            
$this->statusText = null;
            
$isBody = false;
            while (!
feof($this->sock))
            {
                
$line = fgets($this->sock, 1024);
                if (
$this->status === null)
                {
                    if (!
preg_match("/^HTTP\/[\d.]+\s+(\d+)(\s+([^\r\n]+))?/i", $line, $matches)) throw new Exception('Invalid response');
                    
$this->status = intval($matches[1]);
                    if (isset(
$matches[3])) $this->statusText = $matches[3];
                }
                else
                {
                    if (
$isBody) $this->responseText .= $line;
                    else if (
preg_match("/^[\r\n]+$/", $line)) $isBody = true;
                    else
                    {
                        if (!
preg_match("/^([^:]+):\s*([^\r\n]+)/", $line, $matches)) throw new Exception('Invalid header');
                        
$this->responseHeaders[$this->capitalize($matches[1])] = $matches[2];
                    }
                }
            }
            
fclose($this->sock);
            
            if (
array_key_exists('Transfer-Encoding', $this->responseHeaders) && preg_match('/(^|[,\s])chunked([,\s]|$)/i', $this->responseHeaders['Transfer-Encoding'])) $this->responseText = preg_replace("/^[a-f0-9]+[^\r\n]*\r?\n|\r?\n0+[^\r\n]*[\r\n]+$/i", '', $this->responseText);
        }
    }
    
    function
getResponseHeader($name)
    {
        
$name = $this->capitalize($name);
        return
array_key_exists($name, $this->responseHeaders) ? $this->responseHeaders[$name] : null;
    }
    
    function
getAllResponseHeaders()
    {
        
$headers = '';
        foreach (
$this->responseHeaders as $name => $value)
        {
            
$headers .= "$name: $value\r\n";
        }
        return
$headers;
    }
    
    private function
capitalize($text)
    {
        return
preg_replace('/(^|[^0-9A-Za-z_])([a-z])/e', 'str_replace(\'\\\\"\', \'"\', \'$1\') . strToUpper(\'$2\')', strToLower($text));
    }
}
?>

...a następnie wystarczy:
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<?php
$hr
= new HttpRequest;
$hr->open('GET', 'http://www.forumweb.pl/api/users/get_online.php');
$hr->send();
if (
$hr->status == 200)
{
    
$data = @ unserialize($hr->responseText);
    if (
$data !== false)
    {
        
// do something...
        
var_export($data);
    }
}
?>


Ale Twój przykład świetny! Na pewno przyda się innym, którzy chcieliby wykorzystać format XML np. w Pythonie, Ruby czy Javie, a nawet w PHP.
 

_________________
stop-ie6.png


Ostatnio zmieniony przez kurshtml dnia 23.01.2010 11:25, w całości zmieniany 2 razy
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x800
jsmp
Recenzent
jsmp

Płeć: Mężczyzna
Wiek: 21
Dołączył(a): 15 Paź 2006
Posty: 3955
Pomocy: 147
Post Wysłany: 01.09.2009 01:22
Zacytuj zaznaczone   ^

Odkryłem jak łączyć (może nie poprawnie Wink bo chyba service umożliwia takie coś, z tego co zrozumiałem ) kliku danych...


Gdyż Get_online nie dostarcza informacji o ilości postów, postanowiłem to przetestować wyciągając ID i wg ID ilość postów Smile
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<?php

$doc
= new DOMDocument('1.0', 'UTF-8');
$doc->load('http://www.forumweb.pl/api/users/get_online.xml');
$username = $doc->getElementsByTagName('username');

$uri = $doc->getElementsByTagName('uri');
$av = $doc->getElementsByTagName('user_avatar');
$id = $doc->getElementsByTagName('user_id');
$posts = $doc->getElementsByTagName('user_posts');


  echo
"<ol>";
for(
$i = 0; $i < $username->length; ++$i)
{
$doc2 = new DOMDocument('1.0', 'UTF-8');
$doc2->load('http://www.forumweb.pl/api/users/get.xml?user_id='.$id->item($i)->nodeValue);
$user_posts = $doc2->getElementsByTagName('user_posts');
  echo
'<li><a href="'.$uri->item($i)->nodeValue.'" ><img src="'.$av->item($i)->nodeValue.'" width="80" height="80" border="0"/>'.$username->item($i)->nodeValue.'</a> Ilo&#182;ć postów: '.$user_posts->item($i)->nodeValue.'</li>';
};
  echo
"</ol>";
?>

 

_________________
Pozycjonowanie strony - jak zdobyć najlepsze pozycje w wyszukiwarkach!

Specjalista ds. marketingu internetowego [zobacz certyfikat]
  
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora  
Numer Gadu-Gadu
5103910
 
 
 
 
 
Skype
 
FirefoxWinXP1024x768
kurshtml
Administrator
kurshtml

Płeć: Mężczyzna
Wiek: 30
Dołączył(a): 02 Mar 2004
Posty: 4462
Pomocy: 44
Post Wysłany: 01.09.2009 20:37
Optymalizacja
Zacytuj zaznaczone   ^

@jsmp: Twój drugi przykład bardzo dobrze pokazuje bardziej zaawansowany sposób użycia API - brawo Smile Przy czym jest trochę mało optymalny, bo dla każdego użytkownika z listy pobiera dodatkowy plik XML, co trochę trwa.

Właśnie zmodyfikowałem wszystkie metody API, tak aby zamiast pojedynczych identyfikatorów przyjmowały listę identyfikatorów, dzięki czemu to samo można wykonać tylko dwoma zapytaniami HTTP:
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<?php
$doc
= new DOMDocument('1.0', 'utf-8');
$doc->load('http://www.forumweb.pl/api/users/get_online.xml');

$username = $doc->getElementsByTagName('username');
$uri = $doc->getElementsByTagName('uri');
$av = $doc->getElementsByTagName('user_avatar');
$id = $doc->getElementsByTagName('user_id');

$ids = '';
for (
$i = 0; $i < $id->length; ++$i)
{
    
$ids .= ',' . $id->item($i)->nodeValue;
}

if (
$ids != '')
{
    
$doc2 = new DOMDocument('1.0', 'utf-8');
    
$doc2->load('http://www.forumweb.pl/api/users/get.xml?user_id=' . substr($ids, 1));
    
    
$user_website = $doc2->getElementsByTagName('user_website');
    
$user_occ = $doc2->getElementsByTagName('user_occ');
    
$user_interests = $doc2->getElementsByTagName('user_interests');

    echo
'<ul>';
    for (
$i = 0; $i < $id->length; ++$i)
    {
        echo
            
'<li>' .
                
'<a href="' . htmlspecialchars($uri->item($i)->nodeValue) . '">' . ($av->item($i)->nodeValue == '' ? '' : '<img src="' . $av->item($i)->nodeValue.'" alt="' . $username->item($i)->nodeValue . '" width="80" height="80" border="0" />') . $username->item($i)->nodeValue . '</a>' .
                
'<dl>' .
                    
'<dt>WWW</dt><dd>' . $user_website->item($i)->nodeValue . '</dd>' .
                    
'<dt>Zawód</dt><dd>' . $user_occ->item($i)->nodeValue . '</dd>' .
                    
'<dt>Zainteresowania</dt><dd>' . $user_interests->item($i)->nodeValue . '</dd>' .
                
'</dl>' .
            
'</li>';
    }
    echo
'</ul>';
}
?>


Przypominam również o metodzie _services/get. W powyższym przypadku była akurat zupełnie nieprzydatna, ponieważ drugie zapytanie zależy od pierwszego, tzn. wykorzystuje dane pobrane w pierwszym zapytaniu, a więc muszą one zostać wywołane sekwencyjnie. Często jednak, kiedy zapytania są niezależne (wynik jednego nie ma wpływ na parametry wejściowe drugiego), można je wykonać równolegle - za pomocą pojedynczego zapytania HTTP - właśnie dzięki _services/get:
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<?php
$doc
= new DOMDocument('1.0', 'utf-8');
$doc->load('http://www.forumweb.pl/api/_services/get.xml?_[online][_class]=users&_[online][_method]=get_online&_[top_10][_class]=users&_[top_10][_method]=get_top_10');

echo
    
'<h1>Online</h1>' .
    
'<ul>';
$users = $doc->getElementsByTagName('online')->item(0);
$uri = $users->getElementsByTagName('uri');
$username = $users->getElementsByTagName('username');
for (
$i = 0; $i < $uri->length; ++$i)
{
    echo
'<li><a href="' . htmlspecialchars($uri->item($i)->nodeValue) . '">' . $username->item($i)->nodeValue . '</a></li>';
}
echo
    
'</ul>' .
    
'<h1>Top 10</h1>' .
    
'<ul>';
$users = $doc->getElementsByTagName('top_10')->item(0);
$uri = $users->getElementsByTagName('uri');
$username = $users->getElementsByTagName('username');
for (
$i = 0; $i < $uri->length; ++$i)
{
    echo
'<li><a href="' . htmlspecialchars($uri->item($i)->nodeValue) . '">' . $username->item($i)->nodeValue . '</a></li>';
}
echo
'</ul>';
?>


Oczywiście obie powyższe uwagi odnoszą się również do wywołań API z poziomu JavaScript (za pomocą klasy JSONHttpRequest) oraz PHP (za pomocą klasy HttpRequest, którą przedstawiłem kilka postów wcześniej).
 

_________________
stop-ie6.png
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x800
jsmp
Recenzent
jsmp

Płeć: Mężczyzna
Wiek: 21
Dołączył(a): 15 Paź 2006
Posty: 3955
Pomocy: 147
Post Wysłany: 25.09.2009 23:57
Zacytuj zaznaczone   ^

Ostatnio zgłębiając XML'a poznałem SimpleXML. Kod pozwala w o wiele krótszy sposób przeparsować kanał xml. Poniżej przykład z postu - tam zawierał 22 linijki, tu 9.
Kod:   Zaznacz   Podgląd (X)HTML   Uruchom   Zapisz
<?php
$xml
= simplexml_load_file('http://www.forumweb.pl/api/users/get_online.xml');
foreach (
$xml->user as $foo)
    {
echo
'<li><a href="'.$foo->uri.'" ><img src="'.$foo->user_avatar.'" width="80" height="80" border="0"/>'.$foo->user_name.'</a></li>';
    };
?>


Jedyny mankament, to to że musi być chyba odpowiednia opcja włączona w ustawieniach serwera.
 

_________________
Pozycjonowanie strony - jak zdobyć najlepsze pozycje w wyszukiwarkach!

Specjalista ds. marketingu internetowego [zobacz certyfikat]
  
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora  
Numer Gadu-Gadu
5103910
 
 
 
 
 
Skype
 
FirefoxWinXP1024x768
kurshtml
Administrator
kurshtml

Płeć: Mężczyzna
Wiek: 30
Dołączył(a): 02 Mar 2004
Posty: 4462
Pomocy: 44
Post Wysłany: 26.09.2009 15:54
Zacytuj zaznaczone   ^

To prawda, pakiet SimpleXML jest bardzo wygodnym narzędziem. Na dodatek podobne implementacje są dostępne w większości popularnych języków programowania: PHP, Python, Perl, Ruby, Java, C++. Jeśli ktoś używa Linuksa, pewnie standardowo ma zainstalowanego Perla - można sobie wypróbować, jak to działa spod konsoli.
 

_________________
stop-ie6.png
  
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora  
 
 
Jabber
 
 
 
 
OperaLinux1280x800
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Szybka odpowiedź
Kod potwierdzający
Użytkownik
Temat
Very Happy Smile Sad Surprised Shocked Confused Cool Laughing Mad Razz Embarassed Crying or Very sad Evil or Very Mad Twisted Evil Rolling Eyes Wink Exclamation Question Idea Arrow Neutral Mr. Green + - *
  

  Zamknij Tagi
 
 

Zobacz następny temat
Zobacz poprzedni temat
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

RSS Przełącz do wersji mobilnej

[trening.net.pl]
[www.olympiquem.pl] [www.anno.xon.pl]
Powered by phpBB © 2001, 2005 phpBB Group
Uruchamianie kodu dzięki Sphere Research Labs w ramach ideone.com
Style created freely by Cyber-MX :: Modified by logeen :: Sponsor: Biuro Rachunkowe
katalog stron
katalog stron
kbkteam.net
bajkar

www.bajkar.sitpchem…
Klimatyzacja
Clima Cool
www.climacool.pl
systemy CMS
Profesjonalne systemy CMS !
www.govern.pl
Sklep odżywki
Sklep odżywki
www.megapower.pl