Pokazywanie postów oznaczonych etykietą API. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą API. Pokaż wszystkie posty

wtorek, 24 czerwca 2025

Axios - Promise based HTTP client for the browser and node.js

 Axios to jest biblioteka dla Reacta oraz innych frameworków w języku javascript/typescript do wykonywania połączeń HTTP do API w oparciu o asynchroniczny mechanizm Promise udostępniony na licencji MIT.


https://axios-http.com/docs/intro - strona projektu

https://github.com/axios/axios - link do Githuba


czwartek, 14 lutego 2019

Swagger.io

Good tool for creating JSON API documentation with included free tool for test this API. It is compatiblie with .net core 2.0 API (and .net core 2.0 web app with json result) and for me this is a good choice. It's also free for commercial use (GNU GPL licence) that makes it very useful.
Direct link to tool -> https://swagger.io/

sobota, 7 kwietnia 2018

Postman

In current web development most communication between systems is done using API. In most cases it is REST API.

When working with external API or even when we need to set API for somebody else it would be great to have some good tool for REST API testing. And here comes Postman.   

Postman is free tool for REST API testing, with many functions, easy GUI, and ready for automation testing. Many web developers already use this tool (in example me) and I recommend you to test and maybe you too will start using it in you current work.

External links:
getpostman.com -> website where you can get postman tool

czwartek, 17 marca 2016

Node.js

Ost. czasy bardzo popularnym językiem jest javascript. Ten język istnieje od dosyć dawna, jednak przez wiele lat traktowny był "po macoszemu". Ost. kilka lat, to jednak zdecydowany "boom" na ten konkretny język. Ilość bibliotek i frameworków jaka powstaje jest wprost niesamowita.
Javascript przez wiele lat kojarzony był głównie z frontendem, czyli tą częścią strony www, która wykonuje się bezpośrednio w przeglądarce internetowej. Teraz jednak javascript dorobił się porządnego rozwiązania serwerowego, zgodnie z ideologią "jeden język programowania - wszędzie". Typ rozwiązaniem serwerowym jest Node.js

Krótki wpis, co to jest npm (node package manager), jak i samo nodejs można znaleźć na blogu Gutka link, więc nie będę się tutaj powtarzał, szczególnie, że Gutek opisał to fajnie, zgrabnie itp (ohy i ahy).

Ja z mojej strony polecił bym zacząć się z tym bawić, od robienia tutoriali z nodeschool.io/.Samemu skończyłem już część Core-ową i aktualnie robię wersję rozszerzoną i jak na razie mi się to podoba. A, że warto spróbować i dać nodejs szansę, to warto spojrzeć choćby na przykładowy serwer wystawiający json-y, jaki można postawić z wykorzystaniem biblioteki "express".

var portNumber = process.argv[2];
var url = require('url');
var express = require('express');
var app = express();

app.get('/api/parsetime', function(req, res){
  var parsedUrl = url.parse(req.url, true);
  var date = new Date(parsedUrl.query.iso);

  res.json({ hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds()  })
});
app.get('/api/unixtime', function(req, res){
  var parsedUrl = url.parse(req.url, true);
  var date = new Date(parsedUrl.query.iso);

  res.json({ unixtime: date.getTime() })
});

app.listen(portNumber);

Wygląda znajomo?
Prawie, jak w we wspaniałym nancyfx.org.
Dodatkowo, fajnie rzeczy można wyczarować operując na strumieniach danych (nieco inaczej się operuje niż w c#) oraz tworzyć z nich "wężyki" Method chaining.

Całkiem interesująca technologia.



















czwartek, 18 września 2014

Google Charts w ASP.MVC (Razor)

Do rysowania wykresów za pośrednictwem ASP.MVC postanowiłem użyć darmowej biblioteki dostarczonej przez google, czyli chart. Wykresy rysuje się w tym w sposób bardzo prosty i przyjemny, tj. za pomocą javascriptu. Przykłady są dobrze opisane, oraz zawierają odnośnik do jsfiddle.
Całość sprowadza się, do odniesienia się do wgrania zew. biblioteki rys.
<script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1','packages':['corechart']}]}"></script>
wybrania miejsca, w którym ma się ten wykres narysować:
     <div id="piechart" style="width: 900px; height: 500px;"></div>
stworzenia metody rysującej oraz "podpięcie" jej pod delegata:
      google.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Task', 'Hours per Day'],
          ['Work',     11],
          ['Eat',      2],
          ['Commute',  2],
          ['Watch TV', 2],
          ['Sleep',    7]
        ]);
        var options = {
          title: 'My Daily Activities'
        };
        var chart = new google.visualization.PieChart(document.getElementById('piechart'));
        chart.draw(data, options);
      }

Ok.Mamy javascript, mamy jsfiddle, na którym możemy przetestować nasz odpowiednik wykresu, a nawet kilka wykresów pod sobą. A co jeżeli jako źródło danych, chcieli byśmy wykorzystać model z naszego ASP.MVC ??

Na szczęście istnieje znacznik (tag) <text>  </text> który możemy wykorzystać.
Poniżej przykład takiej metody:

        function drawCurrency() {
            @if (Model.Tasks != null && Model.Tasks.Count > 0)
            {
                <text>
                var data = google.visualization.arrayToDataTable([
                ['Task', 'Hours per Day'],
                @foreach (var task in @Model.Tasks)
                {
                    <text>
                    ['@task.name', parseFloat('@task.hour')],
                    </text>
                }
                ]);
                var chart = new google.visualization.PieChart(document.getElementById('piechart'));
                chart.draw(data, options);
                </text>
            }
        }

czwartek, 2 stycznia 2014

NancyFx

O nancy pierwszy raz usłyszałem 28.11.2013r. podczas 70 spotkania Warszawskiej Grupy .NET (WG-.NET). Prezenterem był nie kto inny, jak sam Maciej 'Procent' Aniserowicz, czyli obecnie najpopularniejszy bloger/programista .NET. Tak się składa, że blog Maćka czytam/przeglądam ze zmienną regularnością od dłuższego czasu, więc nie mogło mnie na tym spotkaniu zabraknąć. A co prezentował Maciek? Nowy, lekki,  otwarty (github z kodem źródłowym), web framework, oparty na zasadzie KISS nazwanej tutaj "super-duper-happy-path".

Autorzy sami o swoim dziele napisali kilka słów pod tym linkiem ;)

A więc co tak naprawdę daje nam nancy?
- jest lekkie i wymaga od użytkownika minimum kodu. Przykład? Cały kod potrzebny do napisania aplikacji webowej:
public class SampleModule : Nancy.NancyModule
{
    public SampleModule()
    {
        Get["/"] = _ => "Hello World!";
    }
}
- jest w pełni konfigurowalna, tzn. praktycznie wszystko można skonfigurować/nadpisać. W ost. zawsze można napisać do autorów maila, lub znaleźć odpowiedni fragment kodu i go samemu poprawić (w końcu to open source ;))
- jest całkiem fajnie przemyślany, więc pisze się w tym stosunkowo szybko i wymaga to od programisty naprawdę mało kodu. Dlaczego mała ilość kodu jest ważna rozpisywało się już mnóstwo osób, np: Jeff Atwood - Najlepszy kod to brak kodu w ogole
- jako widok można używać zarówno html, xhtml, aspx, razor jak i wielu innych widoków
- jako kontener standardowy wykorzystywany jest tinyIoC, ale można wykorzystywać też inne
- kod jest łatwo testowalny, co pokazał Christian Horsdal w swojej książce "Instant Nancy web development"  (przykłady z wykorzystaniem xUnit oraz fakeItEasy)
- aplikacje można hostować zarówno w .NET jak i Mono
- logowanie błędów jest dziecinnie proste i zajmuje znacznie mniej miejsca niż w innych aplikacjach 
- dużo lepsze (i łatwiejsze) routingi niż w ASP MVC 4
- bardzo łatwo można przekształcić aplikację webową w konsolową, a nawet w projekt, w którym będą solucje: "core", "web", "console", "test".

Generalnie, po prelekcji Maćka Aniserowicza oraz przerobieniu książki Christiana Horsdala, jestem wielkim optymistą jeżeli chodzi o NANCY. Aż się nie mogę doczekać momentu, w którym będę miał nieco wolnego czasu, aby przerobić jeszcze jakiś tutoriale związane z tą technologią, oraz... zastosowania tej wiedzy w praktyce, w jakimś komercyjnym projekcie.

wtorek, 5 listopada 2013

Send SMS message by Mobitex API (HttpWebRequest)

Jedną z podstawowych funkcjonalności niemal każdej aplikacji jest możliwość wysyłania powiadomień mailowych. Coraz częściej zdarza się jednak, że klient chce mieć również możliwość wysyłania krótkich powiadomień tekstowych (tzw. SMS) na telefon komórkowy. Usługę taką w praktyce realizuje się poprzez zewnętrznych partnerów, którzy, w zamian za stosowną opłatę wystawiają nam API, z którym możemy się połączyć. W przeszłości widziałem rozwiązania kilku producentów i... każdy miał na to "swój" sposób (od wystawienia web service, poprzez web request z parametrami wiadomości przesłanymi poprzez URL, na wysyłaniu specjalnie skonstruowanego maila na podaną skrzynkę email ;)).
W takich chwilach jak ta, gdy o tym wspominam zaczynam żałować, że tak późno zacząłem prowadzić mojego bloga ;)

Ale do rzeczy. W tym konkretnym poście opiszę sposób integrowania się z API dostarczonym przez firmę Mobitex. Firma mobitex, wystawia publicznie dostępną specyfikację swojego API (specyfikacja_mt.pdf). Specyfikacja jest krótka, zwięzła i na temat.

W tym konkretnym przypadku, wysyłanie SMS odbywa się poprzez zwykły WebRequest z parametrami przekazanymi w querystringu, a w zamian dostajemy odpowiedź w strumieniu (Stream) za pomocą standardowego WebResponse.

Całość jest całkiem prosta i może być zrealizowana, za pomocą klasy z jedną metodą (co najwyżej należy skonfigurować parametry wedle naszych potrzeb):

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Text;
using System.Web;

namespace sms
{
    public class MobitexApi
    {
        public static List<KeyValuePair<string, string>> SendSms(string number, string text)
        {
            List<KeyValuePair<string, string>> keyValueResponse = new List<KeyValuePair<string, string>>();
            try
            {
                string user = "userName";
                string pass = "passInMD51a2bc4f3f52dac6d872ae12";
                string type = "sms";
                string from = "fromUserName";
                string ext_id = "1234";
                string encodedText = HttpUtility.HtmlEncode(text);

                string requestStringUrl = string.Format("https://api.mobitex.pl/sms.php?user={0}&pass={1}&type={2}&number={3}&text={4}&from={5}&ext_id={6}",
                    user, pass, type, number, encodedText, from, ext_id);

                HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create(requestStringUrl);
                //handle error code: ssl_error_bad_cert_domain
                HttpWReq.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
                delegate
                {
                    return true;
                });
                HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();

                Stream response = HttpWResp.GetResponseStream();
                StreamReader reader = new StreamReader(response);
                string responseString = reader.ReadToEnd();
                HttpWResp.Close();

                var respStringTable = responseString.Split(',');

                for (int i = 0; i < respStringTable.Length; i++)
                {
                    string keyValue = respStringTable[i];
                    if (!string.IsNullOrEmpty(keyValue))
                    {
                        string key = keyValue.Substring(0, keyValue.IndexOf(':'));
                        string value = keyValue.Substring(keyValue.IndexOf(": ") + 1);

                        keyValueResponse.Add(new KeyValuePair<string, string>(key, value));
                    }
                }
            }
            catch (Exception ex)
            {
                //TODO:
                //Error handling in here (for example NLog)
            }
            return keyValueResponse;
        }
    }
}
Całość rozwiązania sprowadza się, do utworzenia odpowiedniego querystringa, w którym przekazujemy wszystkie interesujące nas parametry (patrz dokumentacja), a nast. tworzymy web request. Przed wykonaniem dodajemy obsługę eventu "ServerCertificateValidationCallback". Jest to spowodowane tym, że mobitex posiada nieprawidłowy certyfikat bezpieczeństwa i w trakcie wykonywania httpWebRequest dostajemy pytanie czy jesteśmy tego świadomi i mimo to chcemy kontynuować naszą akcję. Po wszystkim, dostajemy odpowiedź z mobitexu, która wyglada mniej więcej tak:
Status: 002, Id: 03a72a49fb9595f3737bc4a2519ff283, Number: 4860X123456
 więc parsujemy ją do nieco bardziej przyjaznego w obsłudze typu danych, czyli kolekcji obiektów typu "KeyValuePair".

Mobitex posiada też możliwość sprawdzenia stanu konta. Czytając dokumentację techniczną brakuje mi natomiast jakiegoś raportu podsumowywującego wszystkie sms wysłane w danych (sparametryzowanym) okresie czasu z danego konta (gdybym chciał zobaczyć datę, status oraz num. tel na jakie wysłałem wszystkie sms powiedzmy w poprzednim mieś.) i myślę, że w najbliższym czasie im takie pytanie zadam.


p.s. W przypadku korzystania z sieci korporacyjnych, należy się upewnić, aby mieć odblokowany port 443 dla serwera 213.5.10.22.
p.s.2 Uwaga. Nr. tel. w parametrze powinien być w formacie 4860X123456
p.s.3  ServerCertificateValidationCallback dostępny jest dopiero w .NET 4.5