Price comparison script with wordpress and rest api

Hey guys,

i’m back.
It took me some time here to move into my new flat, but now most things are done and the most important thing: my internet connection is up. yehaa!

So today im going to show you some stuff with wordpress and some rest webservices.
I will implement a price comparison script in wordpress,
so that you can enter your affiliate links from amazon & co and sell stuff on your page.
The most cool thing about that will be the rest api:
This will enable you to import any data into your webshop, no matter what file format you are given (csv, xml, json …), no matter what programming language you are going to use.

There are a few steps needed to achieve this, but it wont be too hard.

What will you learn?

If you are not familiar with programming wordpress plugins you will get an introduction to that.
At the same time you will have some fun with rest. :)

Prerequisites

What will you need in order to be able to reproduce and understand this little tutorial?
– Not that much. Pretty basic stuff, you should be familiar with rest webservices (implementing rest webservices (jersey) with java , basic understanding of http get & post and a little php.
You can use our free java web services (which are included by default in this tutorial),
but you are not required to do so.
If you do so, you get some advantages:

  • You don’t need an appserver, just a webserver with wordpress
  • You don’t need to program web services :)
  • You don’t need (another) database
  • The webservices are reliable, secure and free

If you use our webservices, go and get your free userpasswordToken here.

Because a picture is worth a thousand words: a small picture :)

price comparison script

price comparison script

Should be self explaining, if it’s not, go on with reading ;)

Basically, we won’t save any of our data in wordpress (or its database).
Wordpress is just used as stupid front end, just showing the stuff our rest services will serve.
But why use webservices?
Here are some pros that we get from using webservices:

  • clean, easy to use rest api, enables you to import any data given in any format (csv, xml, json,..)
  • no need to change wordpress code / write plugins if you need to import data in new format
  • easy inclusion of data from affiliate programms (affili.net, belboon, ..)

First step – Prepare the backed – Rest API

Just a quick look at the source code for our rest api (code shortened, see attachements for full source code):

@Path("/v1/pcs")
@Stateless
public class PriceComparisonService extends AuthenticatedResource {

    @POST
    @Path("deleteProduct")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String deleteProduct(@FormParam("productId") Long productId, @FormParam("userpasswordToken") String userpasswordToken) {

        if (this.authUser(userpasswordToken)) {
            repository.deleteProduct(productId, userpasswordToken);
        }
        return null;
    }

    @GET
    @Path("getProducts")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public String getProducts(@QueryParam("userpasswordToken") String userpasswordToken) {
        if (this.authUser(userpasswordToken)) {
            List<de.hm.entity.entities3.Product> allProducts = repository.getProductsByAuthentication(userpasswordToken);
            List<String> encodedProductList = new ArrayList<String>();
            for (Product prod : allProducts) {
                encodedProductList.add(prod.toJSONString());
            }
            JSONArray jsonArr = new JSONArray();
            jsonArr.addAll(encodedProductList);
            return jsonArr.toJSONString();
        }
        return null;
    }

    @POST
    @Path("saveProduct")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void saveProduct(
            @FormParam("description") String description,
            @FormParam("imageurl") String imageurl,
            @FormParam("link") String link,
            @FormParam("name") String name,
            @FormParam("price") String price,
            @FormParam("rating") String rating,
            @FormParam("seller") String seller,
            @FormParam("version") String version,
            @FormParam("userpasswordToken") String userpasswordToken) {
        if (this.authUser(userpasswordToken)) {
            de.hm.entity.entities3.Product product = new de.hm.entity.entities3.Product();
            product.setDescription(description);
            product.setImageurl(imageurl);
            product.setLink(link);
            product.setName(name);
            product.setPrice(Float.parseFloat(price));
            product.setRating(rating);
            product.setSeller(seller);
            product.setVersion(Integer.parseInt(version));
            Authentication auth = new Authentication();
            auth.setUserPasswordToken(userpasswordToken);
            product.setAuthentication(auth);
            repository.saveProduct(product);
        }
    }
}

As you can see there is one method for saving a new product, deleting an existing one and a getter for listing all the products.
Each method does one thing before it does anything else – it looks for the userpasswordToken if the user is authenticated to do anything.
If he is so, he gets or saves the data with his token.
This second step ensures that every user just gets his own data and not the data of another user.
The methods itself are quite straight forward: just reading and writing entitiys to database, i won’t explain that in detail, you can have a look at the source code attached again.

Second step – WordPress adaption

First we create a file that will implement our plugin.
Feel free to give it a name you like.
In order to make the plugin work, you will have to enter the plugin name in the comments:

/*
 * Plugin Name: WPExtendedCompare
 */

Note: I will not say anything here about licensing.
There are several wordpress tutorials who will explain that better, if you are interested in that please consider reading a tutorial on programming wordpress plugins.

This will be our class:


if (!class_exists('WPExtendedCompare')) {

    class WPExtendedCompare {

            var $settings;

            function WPExtendedCompare() {
            add_shortcode("extcomp", array(&$this, 'show_ext_comp'));
            if (is_admin()) {
                add_action('admin_menu', array(&$this, 'add_menupages'));
            }
            // further code will go here..
        }
    }
}

The settings variable would be a holder for your settings you make to your plugin, however we won’t need that right now.
The function add_shortcode will create our shorttag, so that from now (if we activate our plugin) we can just write [extcomp] and wordpress will parse whatever the function ‘show_ext_comp’ returns – we will have to define that now.

function show_ext_comp() {
     include( 'CompForm.php' );
     $form = new CompForm($this->getData());
     $form->show();
}

So our function includes another PHP file, ok, no magic here.
Then the constructor gets whatever getData() returns – again, we will have to define that.
$form->show will show whatever has to be shown, see details later.

Next step will be made with two functions:

 function getProducts($userpasswordToken = "brosef") {
            $serviceUrl = 'http://78.47.190.21:8080/pcs/webresources/v1/pcs/getProducts?userpasswordToken=' . $userpasswordToken;
            $curl = curl_init();
            curl_setopt($curl, 10002, $serviceUrl);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

            $curl_response = curl_exec($curl);
            curl_close($curl);
            return json_decode($curl_response, true);
        }

        function getData() {
            $json = $this->getProducts();
            $rows = array();
            foreach ($json as $input) {
                $arrInput = json_decode($input, true);
                $rows[] = array(
                    'imageurl' => $arrInput['imageurl'],
                    'sellerurl' => $arrInput['seller'],
                    'price' => $this->formatCurrency($arrInput['price']),
                    'rating' => $arrInput['rating'],
                    'link' => $arrInput['link'],
                    'descr' => $arrInput['description'],
                    'pid' => $arrInput['id'],
                );
            }

            return $rows;
        }

Look at getProducts() first, because thats were the magic happens – here we call our rest api (that we have implemented in step 1) and by json_decode we give the decoded result to the function getData().
Remember – getData() returns whatever the CompForm constructor gets, so we put that into a nice little array so everything is in the right place.
Have a look at CompForm.php:

<?php

class CompForm {

    private $output;
    private $template;
    private $row;

    public function __construct($data) {
        $this->template = $this->getTemplate();
        $this->row = $this->getRow();
        $this->parseParams($data);
    }

    private function getRow() {
        ob_start();
        include( 'ContactFormTemplate.html' );
        $ret = ob_get_contents();
        ob_end_clean();
        return $ret;
    }

    private function getTemplate() {
        ob_start();
        include( 'rahmen.html' );

        $ret = ob_get_contents();

        ob_end_clean();
        return $ret;
    }

    public function show() {
        echo $this->output;
    }

    public function parseParams($params) {
        $rows = "";
        $newRow = $this->row;
        foreach ($params as $row) {
            $newRow = $this->row;
            foreach ($row as $key => $val) {
                $newRow = str_replace("#" . $key . "#", $val, $newRow);
            }
            $rows .= $newRow;
        }
        $this->output = str_replace("#rows#", $rows, $this->template);
    }
}
?>

Theres a simple (not very complex) parser, that will parse every value from our json data into the array.
It just substitutes every #key# in the templates with the value of key (value and key in terms of : indexing key in the json structure and the resulting value).
The templates are very simple (and not very elegant :P ), you can make better ones :)
I will not explain the templates – its obvious.

Some hooks are still required to be made in order to test our plugin:

function add_menupages() {

            add_options_page("Price Compare Settings", "Price Compare Settings", "manage_options", 'pcs-options', array(&$this, 'my_plugin_options'));
        }

        function my_plugin_options() {
            if (!current_user_can('manage_options')) {
                wp_die(__('You do not have sufficient permissions to access this page.'));
            }
            include 'wpcompare_add_product.php';
        }

This will add a menu item in the settings menu with a form to add manually products to our price comparison plugin.

See wpcompare_add_product.php (code has been shortened, see archive for full source code):

<html>
    <form class="form-style" method="post" action="http://78.47.190.21:8080/pcs/webresources/v1/pcs/saveProduct/">
        <table>
            <tr>
                <td><div>product name</div></td>
                <td><div><input type="text" name="name" id="name" value="" /></div></td>
            </tr>
            <tr>
                <td><div>description</div></td>
                <td><div><input type="text" name="description" id="description" value="" /></div></td>
            </tr>
            <tr>
                <td><div>image (url)</div></td>
                <td><div><input type="text" name="imageurl" id="imageurl" value="" /></div></td>
            </tr>
            <tr>
                <td><div>link</div></td>
                <td><div><input type="text" name="link" id="link" value="" /></div></td>
            </tr>
            <tr>
                <td><div>price</div></td>
                <td><div><input type="text" name="price" id="price" value="" /></div></td>
            </tr>
            <tr>
                <td><div>rating</div></td>
                <td><div><input type="text" name="rating" id="rating" value="" /></div></td>
            </tr>
            <tr>
                <td><div>seller (url)</div></td>
                <td><div><input type="text" name="seller" id="seller" value="" /></div></td>
            </tr>

        </table>
        <input type="hidden" name="userpasswordToken" id="userpasswordToken" value="brosef" />
        <input type="hidden" name="version" id="version" value="1" />	
        <input type="submit" value="save product"/>
    </form>
</html>

This will directly call our rest api and post the params to the saveProduct Method – notice the name of the input fields, which are each just equal to the names of the fields in the rest service.
No confirmation after clicking the button (this is your homework ;) ), but the post is being performed, just have a look at the price comparison script!
To do so, just create a new wordpress page and add the shortcode we defined: [extcomp]
That’s it!
You can see a live demo here.

conclusion

You just implemented some simple rest web services with jersey and called that rest api into your own wordpress plugin. good work!

What’s next?

In order to make this stuff useable there are a few things left:

  • different templates
  • You may want to list your products with some different data – let’s say you need to list delivery costs in another column.
    So the templates should be editable (i mean editable in a “convenient” way, means not to go and edit source code but have a nice form which adds fields).

  • import different file formats & automated import using cronjob
  • In Reality you won’t add every single product manually.
    You will get a xml or anything smiliar (csv, json, etc..) and want that get importet automatically every 60 minutes or something..
    Theres a quick way for solving this in an elegant way through the rest api :)

  • ordering and filtering / grouping products for different tables
  • You may want to sell dog food on one page and cat food on another.
    So ideally you would just drop a wordpress page with:
    [extcomp dogfood] or [extcomp catfood] to show two different product comparison tables with different products.
    A better way could be to achieve that using filtering and / or ordering:
    [extcomp filter=dogfood orderby=price desc] (sql like)

  • clean uninstall
  • Theres some code missing which will blow our stuff out of wordpress if we don’t need our little price comparison script anymore.

These and more will follow in my next post :)
See you then!

attachements

WPExtendedCompare

changes | webservice junkies – java web services

Hey guys,

i thought i’ll do a little post just to show you i’m alive ;)
There has been much work in the past days,
i was moving my flat which was really a huge work and at the moment i am waiting on my new internet provider to enable my internet connection (which really takes much tooo long, so right now i am surfing the net over my mobile internet connection…).
As soon as everything is in his order and my internet is up and running i’ll be back :)

Furthermore there will be some changes on webservices junkies, which i want to announce right now.

language change

Webservice junkies was started as a german project, as i’m from germany.
However, it looks like the german audience is not as big as i expected (or the us-market is just bigger),
so every upcoming post will be in english.
I will also work on the already made posts and translate them from german to english.

So heres a quick introduction for the english audience, so that you guys know what this page is all about.

free java web services

We do offer free java web services.
Our goal is to build a tool set of web services, with out-of-the-box, ready to use webservices.
If you already have been working on an own internet website you already know there are several functions and programs every or almost every website needs,
for example think about a email newsletter service, or tools that will crypt, compress or translate data.
You can use those free java web services and include them into your projects, no matter if it is a website, an iphone app or simply a desktop application.
All you need to do, is to register on this website (for free), so that you get your own userpasswordToken (which will authenticate you as a valid user).

online video tutorials

I will show you different scenarios on how to use our webservices.
There will be video tutorials showing you how to implement an iphone app, a zend framework 2 website and a simple desktop app using our webservices.
Although java web services will have the primary focus here, there will be also tutorials on webservices with c#.

So as you can see there is much upcoming.. stay tuned dudes ;)

rest tutorial: Call a REST webservice from wordpress

rest tutorial

Hey guys,

today im going to write a rest tutorial in english, as i’m tryin to get this on codeproject ;)
I hope my german audience can follow as well!
So let’s start, today i’ll have some thoughts on calling our webservices from wordpress, especialy from a wordpress form.

free newsletter service

I will show you, how to achieve a newsletter service in your wordpress site, using our REST webservice and your wordpress website (you don’t need to use our REST webservice, you can use any webservice you like with the approach described in this tutorial, however it’s free and it is doing its job, so you can give it a try!).
So here we go, first step will be to set up our wordpress form for our user, so he can subscribe to our newsletter.

Setting up the newsletter subscribe form

So go to your wordpress admin and create a new site with some html:

<html>
<form method="post" action="" >
email: <input id="email" name="email" type="text" />
<input type="button" value="submit" id="submit" />
</form>
</html>

Ok, it’s not the most beautiful form i’ve ever created, but it will do it for today ;)
The action tag we will be filling in some minutes, so let’s get to the next step, which in theory would be to implement our webservice call.
But before we do that, we have to set up our newsletter, otherwise our users wouldn’t get any newsletter :)

Setting up the newsletter

Let’s have a look at the webservice api description here.
(You can also have a look at the WADL, but unfortunately SOAPUI doesn’t create my REST Requests properly and i haven’t figured out yet how to fix that, so the wadl won’t be very helpful here)

The saveNewsletter method of the newsletter service consumes 4 parameters for installing a new newsletter.
So let’s create a document for sending a REST Post to the webservice.
Create a new html file and put again some html in it:

<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form method="post" action="http://78.47.190.21:8080/newsletter/webresources/v1/Newsletter/saveNewsletter/">
            <input type="text" name="newsletterId" />
            <input type="text" name="senderEmail" />
            <textarea cols="40" rows="30" name="message"></textarea>
            <input type="text" name="nextSendDate" />
            <input type="hidden" name="userpasswordToken" value="your token goes here" />
            <input type="submit" />
        </form>
    </body>
</html>

Notice how every input element is named, as this is exactly the way how it should be.
Every name equals just to the param name in the webservice.
Also notice the hidden userpasswordToken element, which will authenticate you as proper user (switch the token with your personal token).
You can get your personal userpasswordToken for free at our site.
The nextSendDate Param is just an unix timestamp.
(This is easy and exactly, so you don’t have to take care on how your date has to be formatted.)
The call in the first line is just an example, you will have to adapt that to properly call the service.
So we don’t need any php or other stuff to run that stuff rather than html, so if you have a local webserver installed you can run this from your localhost, pretty cool isn’t it ;)
Again this form won’t be very beautiful for demo purpose, you are allowed to apply your design.
Hit the submit button and a newsletter is set up and will be running on our servers, so you can use that for free :)
Now that the newsletter service is setup and running, we can proceed and add a receiver to that service, that will get our newsletter.

Implementing the webservice call to add a receiver

This is the part where we will call our service from wordpress.
Again have a look at the webservice description.
The saveNewsletterReceiver method of the newsletterReceiver service takes 3 parameters:
The newsletterId of the newsletter we just set up, the email adress of the receiver and again a userpasswordToken to authenticate yourself being allowed to use the service.
We will use curl to call the service.
Create a new PHP file named saveReceiverRest.php and put that into it:

$receiver = $_POST['email'];
$userpasswordToken = "your token goes here again";
saveNewsletterReceiver(5,$receiver,$userpasswordToken);

function saveNewsletterReceiver($newsletterId, $receiverEmail,$userpasswordToken) {
    $serviceUrl = 'http://78.47.190.21:8080/newsletter/webresources/v1/NewsletterReceiver/saveNewsletterReceiver/';
    $curl = curl_init($serviceUrl);
    curl_setopt($curl, CURLOPT_POST, true);
    
    curl_setopt($curl, CURLOPT_POSTFIELDS, "newsletterId=" . $newsletterId . "&receiverEmail=" . $receiverEmail. "&userpasswordToken=" . $userpasswordToken);
    $curl_response = curl_exec($curl);
    curl_close($curl);
}

The first param is the id of the newsletter we set up in the step before.
The second param is the email adress, that the user will enter into the form, we created in the first step.

Just to show you how the webservice looks on server side (in case you are going to write your own webservice) i will give you a look at the Java Code.

This is the Newsletter service for setting up a newsletter:

package de.webservicejunkies.newsletter;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

@Path("/v1/Newsletter")
@Stateless
public class Newsletter extends AuthenticatedResource {

    @EJB
    RepositoryLocal repo;

    /**
     * sets up a newsletter or changes it
     * @param newsletterId - if the newsletterId is new, a new newsletter will be set up. if the newsletterId is already known, the existing data will be changed
     * @param nextSendDate - the date on which the newsletter will be send next
     * @param message - the newsletter content (html allowed)
     * @param senderEmail - the email adress that will be used as sender adress 
     * @param userpasswordToken - token used to authenticate
     */
    @POST
    @Path("saveNewsletter")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void saveNewsletter(
            @FormParam("newsletterId") long newsletterId,
            @FormParam("nextSendDate") String nextSendDate,
            @FormParam("subject") String subject,
            @FormParam("message") String message,
            @FormParam("senderEmail") String senderEmail,
            @FormParam("userpasswordToken") String userpasswordToken) {
        de.hm.entity.entities3.Newsletter newsletter = repo.getNewsletter(newsletterId);
        /**
         * if the newsletter already exists, make sure some proper guy is altering it 
         * if it doesnt exist yet, make sure the guy has a valid token at least
         */
        String savedToken = null;
        try {
            savedToken = newsletter.getAuthentication().getUserPasswordToken();
        }
        catch (NullPointerException e) {
            // ignore - np
        }
        if ((newsletter != null
                && savedToken!=null && savedToken.equals(userpasswordToken)
                && authUser(userpasswordToken)) || (newsletter == null && authUser(userpasswordToken))) {
            repo.saveNewsletter(newsletterId, nextSendDate, subject, message, senderEmail, userpasswordToken);
        }
    }
}

and this will be the NewsletterReceiver Service for adding a receiver to that service:

package de.webservicejunkies.newsletter;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

@Path("/v1/NewsletterReceiver")
@Stateless
public class NewsletterReceiver extends AuthenticatedResource {

    @EJB
    RepositoryLocal repo;

    /**
     * saves a new receiver for receiving newsletter email. 
     * before saving a receiver, a newsletter has to be set up using the newsletter service
     * @param newsletterId - the newsletterId of the newsletter set up by the newsletter service 
     * @param receiverEmail - the email adress of the receiver 
     * @param userpasswordToken - token used to authenticate
     */
    @POST
    @Path("saveNewsletterReceiver")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void saveNewsletterReceiver(
            @FormParam("newsletterId") long newsletterId,
            @FormParam("receiverEmail") String receiverEmail,
            @FormParam("userpasswordToken") String userpasswordToken) throws Exception {
        de.hm.entity.entities3.Newsletter newsletter = repo.getNewsletter(newsletterId);
        if (newsletter == null) {
            throw new Exception("that newsletter does not exist!");
        } else {
            try {
                String savedToken = newsletter.getAuthentication().getUserPasswordToken();
                if (savedToken.equals(userpasswordToken) && authUser(userpasswordToken)) {
                    repo.saveNewsletterReceiver(newsletterId, receiverEmail, userpasswordToken);
                }
            } catch (NullPointerException e) {
            }
        }

    }
}

Exception handling is not very nice also, will follow in v2 ;)
The class AuthenticatedResource just holds some logic for authenticating the user with the userpasswordToken (via method authUser()).
I know this is not a very elegant way of solving authentication with REST but it was the fasted way to achieve that..im working on a better way these days.

So the last step will be to adapt that form, so the webservice can be called properly:
Go to the form and change it, so it looks like that:

<html>
<form method="post" action="saveReceiverRest.php" >
email: <input id="email" name="email" type="text" />
<input type="button" value="submit" id="submit" />
</form>
</html>

The repo EJB is just an EJB writing the stuff to database.

So that’s it!
You can have that into any site of your wordpress website or any widget you want.
If you now hit the submit button the entered email addy will get constantly bombed by the newsletter service ;)
I would recommend to show some “You have been successfully added” message to the user, as soon as he hits the button, otherwise theres no feedback if anything happened after the click.

Ok i hope you enjoyed this small rest tutorial and now have fun implementing that stuff, thanks for reading and your feedback will be very appreciated!

P.S: You will find your userpasswordToken here (notice that you need to be registered).

Rest Webservices in die Homepage einbinden

Hallo liebe Leser!

Erstmal vielen Dank für das viele Feedback, das ihr mir zugesendet habt.
Einige haben nach Rest Webservices gefragt, diesem Wunsch möchte ich nachkommen:
Heute werde ich euch zeigen, wie ihr mit unseren Rest Webservices extrem schnell und einfach zu brauchbaren Ergebnissen kommt.
Es ist so einfach, dass euch grundlegende HTML Kenntnisse reichen (und die haben wir doch alle in der 9. Klasse im Informatikunterricht bekommen, oder? ;) ).
Ihr braucht kein PHP, keine Java, kein Javascript, alles was wir machen werden ist ein HTML Formular erstellen!
So jetzt wünsche ich euch viel Spaß beim Lesen des Artikels und solltet ihr Fragen haben, zögert nicht, sie zu stellen! :)

1. Schritt: HTML Template runterladen

Wie in den Artikeln zuvor werde ich ein HTML Template benutzen, damit wir auch etwas sehen können.
Ihr könnt es euch hier herunterladen.

Ladet euch die Datei runter, öffnet und entpackt Sie und ladet den Ordner artofyourbusiness auf euren Webserver hoch (Achtung, mehrfach verschachtelt, ladet nur den untersten Ordner hoch).
Wenn ihr jetzt euren Server im Webbrowser aufruft, solltet ihr unter www.deinserver.de/artofyourbusiness/index.html eine Webseite sehen, wie auch ich unter: meinem Server.

2. Schritt: Formular erstellen

In diesem Schritt geht es darum, ein Formular zu erstellen, in das der Benutzer seine E-Mail Adresse und ein Passwort eingibt, um sich einen Benutzeraccount auf eurer Seite anzulegen.
Dies werden wir mit Hilfe von jQuery machen, einem JavaScript Framework.
Keine Sorge, ihr müsst nichts programmieren, das Einbinden von jQuery ist denkbar einfach.
Jetzt erstellen wir erstmal unser Formular:
Öffnet die index.html und fügt folgenden HTML Quelltext direkt in den body Bereich (also zwischen

<body>

und

</body>

ein:

<article class="col1 bgwhite">
   <div class="pad bgwhite" id="signupBox">
      <form id ="signupForm" method="post" action="http://78.47.190.21:8080/user/webresources/v1/user/saveUser">
          <input type="hidden" name="userpasswordToken" value="brosef" />
          <input class="input"
                 name="email"
                 type="text" 
                 value="Benutzername" 
                 onblur="if(this.value=='') this.value='Benutzername'" 
                 onfocus="if(this.value =='Benutzername' ) this.value=''" />
           <br /><br />
           <input class="input" 
                  name="password"
                  type="text" 
                  value="Passwort" 
                  onblur="if(this.value=='') this.value='Passwort'" 
                  onfocus="if(this.value =='Passwort' ) this.value=''" />
           <br /><br />
           <a href="#" class="submit" onclick="document.getElementById('signupForm').submit()">                      
               <span><span>Signup</span></span>
           </a>
     </form>
  </div>
</article>

Hier steckt nicht viel Magie drin:
Betrachtet zunächst die Beschreibung unseres Webservices:
Unter action tragt ihr die Adresse des Endpunktes in das

<form>

Tag ein, wie ihr es oben im Beispiel seht. Vergesst nicht das “saveUser” am Ende, denn das ist die Methode, die wir aufrufen werden. Anschließend tragt ihr in die input-Tags für das Attribut “name” die Namen der Parameter genau so ein, wie sie auch im Webservice heißen.
Das ist einmal “email” für die E-Mail Adresse des Benutzers und einmal “password” für das Passwort, mit dem er sich in Zukunft anmelden möchte.
Fast fertig!
Jetzt fehlt noch ein verstecktes Feld für eure Authentifizierung:

<input type="hidden" name="userpasswordToken" value="brosef" />

Diese eine Zeile bewirkt, dass ihr (und nur ihr, also haltet den Token geheim ;) ) jeden Benutzerdatensatz in Zukunft über diesen Token abrufen könnt.
Ihr könnt ihn frei wählen, aber wählt ihn nicht zu einfach, da ansonsten jeder, der ihn kennt (oder erratet) auf eure Daten zugreifen kann.
In meinem Fall ist das “brosef”.
Das wars fast schon!
Eine Kleinigkeit kommt noch.
Damit das ganze etwas schöner aussieht, werden wir das eben erstellt Formular mit jQuery “schweben” lassen.

Fügt wieder im head Bereich folgende Zeilen ein:

<script src="http://code.jquery.com/jquery-1.8.3.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" />
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<script>
   $(function() {
      $( "#signupBox" ).dialog();
   });
</script>

Fertig! Wenn ihr die Index Seite jetzt erneut aufruft, sollte ein Formular aufploppen, wo der Benutzer seine E-Mail Adresse und sein Passwort angeben kann und auf einen Knopf drücken kann, um das Formular abzusenden.

Mit der Methode getUser aus dem selben Service erhaltet ihr über seine userId den Benutzerdatensatz.
Mit der Methode getUsers aus dem selben Service erhaltet ihr eine Liste all eurer Benutzer, die sich auf eurer Seite regístriert haben.

3. Schritt: Benutzerdatensätze abfragen

Habt ihr einen Datensatz über unsere Webservices gespeichert, interessiert euch natürlich gleich, ob das Speichern geklappt hat.
Gebt dazu in euren Browser in die Adresszeile folgendes ein:


http://78.47.190.21:8080/user/webresources/v1/user/getUsers?userpasswordToken=brosef

Ihr müsst natürlich brosef durch euer Userpasswordtoken ersetzen, ansonsten bekommt ihr nur eine Liste aller meiner Benutzer ;)
Die Antwort erhaltet ihr im sog. JSON Format, was sehr effizient von Programmen verarbeitet werden kann (und somit ideal für die Einbindung in eure Webseiten geeignet ist).

Webservice mit Javascript aufrufen

Heute möchte ich euch zeigen, wie ihr mit Hilfe von JavaScript unseren (und jeden beliebigen) Webservice aufrufen könnt.
Somit benötigt ihr rein gar nichts auf eurem Server, kein PHP, kein Java, einfach gar nichts ausser einem Webserver zum Anzeigen eurer Seite (z.B. Apache), denn das JavaScript wird vollständig in eurem Browser ausgeführt.
Momentan haben wir noch keine JavaScript Lib, weshalb hierfür ein kleiner Programmieraufwand nötig sein wird.

In diesem Beispiel werde ich einen weiteren Teil unserer Beispiel-Homepage implementieren.
Heute nehmen wir uns den Login rechts unten auf der Seite vor.

Hierfür wird der Webservice UserData und die Methode loginUser verwendet.
Logischerweise solltet ihr, bevor ihr einen User einloggen möchtet, diesen Benutzer auch über den gleichen Webservice und die Methode saveUser angelegt haben.

Einbinden des Webservices

Öffnet also die Datei index.php mit dem Editor eurer Wahl und sucht die folgende Stelle:


<h2>Customer Log In</h2>
 <form id="form_2" action="" method="post">
  <div>
   <div class="bg left"><input class="input input1" type="text" value="Enter user ID here"	onblur="if(this.value=='') this.value='Enter user ID here'" onFocus="if(this.value =='Enter user ID here' ) this.value=''" />
   </div>
   <div class="bg right">
    <input class="input input2" type="password" value="••••••••••" onblur="if(this.value=='') this.value='••••••••••'" onFocus="if(this.value =='••••••••••' ) this.value=''"	 />
   </div>
   <a href="#" class="submit" onClick="document.getElementById('form_2').submit()">
    <span><span>
      login
    </span></span>
   </a>
   <a href="#">Forgot password?</a> &nbsp;	
   <a href="#">Sign up</a>
  </div>
 </form>

Die Zeile mit

 <a href="#" class="submit" onClick="document.getElementById('form_2').submit()"><span><span>login</span></span></a>

beschreibt den Knopf zum Einloggen des Benutzers. In das onClick schreiben wir rein, was geschehen soll, wenn der Knopf gedrückt wird.
Das was aktuell drinnen steht, würden wir verwenden, wenn wir, wie im ersten Beispiel, über einen Post die Daten an den Server senden würden.
Da wir aber in dem Beispiel hier keine Interaktion mit dem Webserver mehr wollen, werden wir über Ajax einfach unseren User einloggen.
Also löschen wir alles, was in dem onClick-Tag beschrieben ist und ändern es folgendermaßen ab:

<a href="#" class="submit" onClick="javascript:loginUser()"><span><span>login</span></span></a>

Damit rufen wir einfach unsere Javascript Funktion loginUser() auf, die wir weiter oben im Head Bereich der Seite also zwischen

<head>

und

</head>

einfügen:

 <script type="text/javascript">
       function loginUser() {
          $userName = $('#uid').val();
          $password = $('#pwd').val();
          sendLoginRequest($userName, $password);
       }
 </script>

Die Funktion macht nicht sehr viel:
Erst holen wir uns über jQuery die Werte, die der Benutzer in die beiden Eingabefelder eingetragen hat und dann übergeben wir einfach diese Werte an die nächste Funktion sendLoginRequest, welche wir einfach direkt über das eben eingefügte Code Schnipsel einfügen werden.
Damit das aber so funktioniert, müssen wir noch kurz unseren beiden Feldern Namen geben, damit jQuery weiß, was wir auslesen möchten.

Sucht also die Zeilen

<div class="bg left"><input class="input input1" type="text" value="Enter user ID here"	onblur="if(this.value=='') this.value='Enter user ID here'" onFocus="if(this.value =='Enter user ID here' ) this.value=''" /></div>
<div class="bg right"><input class="input input2" type="password" value="••••••••••" onblur="if(this.value=='') this.value='••••••••••'" onFocus="if(this.value =='••••••••••' ) this.value=''"	 /></div>

und ändert Sie ab in:

<div class="bg left"><input id="uid" name="uid" class="input input1" type="text" value="Enter user ID here"	onblur="if(this.value=='') this.value='Enter user ID here'" onFocus="if(this.value =='Enter user ID here' ) this.value=''" /></div>
<div class="bg right"><input id="pwd" name="pwd" class="input input2" type="password" value="••••••••••" onblur="if(this.value=='') this.value='••••••••••'" onFocus="if(this.value =='••••••••••' ) this.value=''"	 /></div>

Der eigentliche Webservice Aufruf

Jetzt kommen wir zum Hauptteil, dem Teil, wo die ganze Magie statt findet ;)
Bisher war alles nur Vorarbeit.

Fügt innerhalb des Script Bereiches (also am Besten direkt über der Funktion loginUser) diese Funktion ein:

var userpasswordToken = "HIER KOMMT EUER TOKEN REIN";

function sendLoginRequest(user, password) {
                var soap = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hm="http://hm.de/">' + 
                    '<soapenv:Header/>' + 
                    '<soapenv:Body>' + 
                    ' <hm:loginUser>' + 
                    '<login>' + user + '</login>'+ 
                    '    <password>' +password+'</password>' + 
                    '<authentifizierung><userPasswordToken>' +userpasswordToken+'</userPasswordToken></authentifizierung>' + 
                    ' </hm:loginUser>' + 
                    '</soapenv:Body>' + 
                    '</soapenv:Envelope>';
        
        
                $.ajax({
                    url: "http://78.47.190.21:8080/UserData/UserData",
                    type: "POST",
                    dataType: "xml",
                    data: soap,
                    complete: onSuccessLoginReq,
                    contentType: "text/xml; charset=utf-8"
                }
            );
            }

Zuerst müssen wir die SOAP-Nachricht aufbauen, die wir verschicken möchten.
Am einfachsten geht das, wenn man sich die Adresse des Endpunktes (also des WSDL-Files) in SOAP-UI einfügt, sich den Request erstellen lässt und das entstandene XML einfach rauskopiert.
Vergesst nicht, den User und das Password, die der Funktion übergeben werden, noch einzubauen (und euer UserpasswordToken).
Dies weisen wir der Variablen soap zu (in der ersten Zeile).

Haben wir unser XML fertig, so starten wir einfach mit der jQUery Funktion $.ajax einen Ajax Request und übergeben ihr noch ein paar Parameter:

url: die Endpunkt Adresse, wie ihr sie auch auf der Beschreibung unserer Webservices findet (ohne “?wsdl” am Ende).

Die restlichen Parameter könnt ihr einfach so übernehmen, da sie nicht so wichtig sind, werde ich hier nicht weiter darauf eingehen.
Eine Sache noch:
Der Parameter “complete” bezeichnet eine Funktion, die aufgerufen wird, nachdem den Webservice aufgerufen wurde.

Kopiert euch also etwas in der Art wieder über die eben eingefügte Funktion, um die Antwort zu verarbeiten:

function onSuccessLoginReq(xmlHttpRequest, status) {
     if ($(xmlHttpRequest.responseXML).find('return').text()=='true') {
       alert("Login OK!");
     }
     else {
       alert("Login failed!");
     }
 }

Was passiert also hier?
Ganz einfach:
Die Antwort, die vom Webservice kommt, sieht so aus: (true, wenn der Benutzer erfolgreich eingeloggt wurde, false wenn nicht)

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:loginUserResponse xmlns:ns2="http://hm.de/">
         <return>true</return>
      </ns2:loginUserResponse>
 </S:Body>
</S:Envelope>

Die Funktion sucht sich also den Knoten “return” und holt sich über die Funktion text() den Wert des Knotens (in diesem Fall true).
Wurde der Benutzer erfolgreich eingeloggt, bekommt ihr also eine Meldung mit “Login OK!”.

Fertig! Das sollte es schon gewesen sein.

Bitte beachtet noch folgenden Hinweis bzgl. der sog. Same Origin Policy:

Gegen die hier beschrieben Vorgehensweise spricht die o.g. Policy.
Es handelt sich hierbei um ein Sicherheitskonzept.
Solltet ihr euch dessen bewusst sein, könnt ihr die Policy umgehen, indem ihr Sie in eurem Browser deaktiviert.
Wie so etwas geht, ist beispielsweise hier beschrieben.

Nutzung der Webservices und Authentifizierung

Hier erkläre ich kurz die Nutzung unserer Webservices in Verbindung mit unserer Authentifizierung (mit PHP).

Authentifizierung bei Nutzung der PHPLib

In diesem Beispiel benutze ich den Webservice ContactMessage aus der PHP Library und als Webservice Aufruf dient das Beispiel mit dem Kontaktformular.
Kopiert den folgenden Quellcode in eure doContactForm.php:


<?php

/*
 * Benutzerdaten eintragen
 */
$userPwToken = "HIER KOMMT EUER PASSWORDTOKEN REIN";
/*
 */

require_once 'ws-clients/ContactMessageData.php';

$name = $_POST['name'];
$email = $_POST['email'];
$msg = $_POST['textarea'];
$webservice = new ContactMessageData();
$saveContactForm = new saveContactForm();
$authentifizierung = new authentication();
$authentifizierung->userPasswordToken = $userPwToken;
$saveContactForm->Authentifizierung = $authentifizierung;
$saveContactForm->email = $email;
$saveContactForm->nachricht = $msg;
$saveContactForm->name = $name;
$webservice->saveContactForm($saveContactForm);
?>

Das meiste sollte euch schon sehr bekannt vorkommen, es ist der Code aus dem o.g. Beispiel.
Hinzugekommen ist nur die Authentifzierung.
Achtet darauf, in der ersten Zeile für “HIER KOMMT EUER PASSWORDTOKEN REIN” euer Passwordtoken zu setzen. Was das ist und wo ihr eins herbekommt erfahrt ihr hier.

Mit

$authentifizierung = new authentication();

wird ein neues Authentifizierungs-Objekt erstellt und mit

$authentifizierung->userPasswordToken = $userPwToken;

wird euer persönliches PasswordToken gesetzt, mit dem ihr dem Server mitteilt, dass ihr auf eure Daten zugreifen dürft.
Mit

$saveContactForm->Authentifizierung = $authentifizierung;

wird noch die Authentifizierung im Container gesetzt, somit ist alles notwendige für die Authentifizierung erledigt und ihr könnt den Aufruf starten.

Wozu soll ich Webservices benutzen, ich kann doch einfach direkt auf meine Datenbank gehen?

Viele von euch werden sich fragen, wozu man eigentlich einen Webservice benutzen sollte, wenn man doch direkt Datenbankaufrufe in seine Webseite programmieren kann.
Prinzipiell kann man nicht sagen, dass der Einsatz von Webservices immer einen Vorteil bringt, hingegen kann es Szenarios geben, wo der Einsatz von Webservices enorme Vorteile bringen kann.

Vorteile von Webservices

Stellen wir uns vor, wir betreiben eine Webseite und möchten nun eine mobile Anwendung dazu anbieten.
Alles was benötigt wird, um einen Webservice zu nutzen, ist HTTP.
Somit lassen sich sämtliche Funktionalitäten, die die Webseite verwendet, auch in die mobile Anwendung integrieren. Es spielt keine Rolle, ob eine Android Anwendung oder eine I-Phone App auf die Webservices zugreifen möchte, es ist problemlos möglich.
Der große Vorteil liegt also darin, dass sämtliche Programmlogik im Backend läuft, während über einen Webservice nahezu jede Art von Front End eingebunden werden kann.
Weiterhin gibt es einen Performance Vorteil, wenn beispielsweise rechenintensive Operationen stattfinden müssen, so werden diese ins Backend ausgelagert und die mobile Anwendung bekommt über den Webservice einfach nur die Ergebnisse mitgeteilt um sie anzuzeigen.

Die eigene Homepage basteln!

Los geht’s!

Hallo und herzlich willkommen zum ersten Beitrag hier auf Webservice-Junkies!
Heute möchte ich euch einen groben Eindruck davon verschaffen, was euch diese Seite hier bringen kann!
Ich beschreibe in diesem Tutorial, wie ihr mit vergleichsweise geringem Aufwand Teile eurer Webseite oder eventuell sogar die komplette Webseite erstellen könnt.
Hierzu werde ich euch zeigen, wie ihr mit den Webservices, die ich euch hier anbiete schnell zu funktionierenden Ergebnissen kommt.
Heute nehmen wir uns ein Kontaktformular vor, in dem der Besucher eurer Seite seinen Namen, seine E-Mail und eine Nachricht hinterlassen kann.
Das Beste daran ist, dass ihr nicht sonderlich viele Programmierkenntnisse benötigt, in diesem ersten Teil hier wird nur ein bisschen PHP verwendet (wirklich nur Grundkenntnisse).
Weitere Vorteile des hier gezeigten Ansatzes sind, dass ihr die Webservices in beliebige Anwendungen integrieren könnt, also eure Homepage, eine Iphone/Android App usw., es muss jeweils nur ein Webservice Aufruf erfolgen und ich zeige euch, wie so ein Webservice Aufruf aussehen muss.
Auch super für euch: Ihr müsst keine Datenbank oder dergleichen installieren / abfragen, das einzige was ihr benötigt ist ein Webserver mit z.B. PHP (auch hierauf kann man verzichten, es geht auch mit client-seitigen JavaScript Aufrufen, dazu ein ander mal mehr).
Ihr braucht also fast gar nichts, wodurch sich so gut wie jede Hosting-Lösung für euch eignet.
In diesem Tutorial gehe ich also nun von einem laufenden Webserver mit PHP aus.
In den nächsten Tagen wird noch ein Video Tutorial folgen, in dem ich all das, was ich hier beschreibe vorführe.
Also jetzt geht’s los, ich wünsche frohes Nachbasteln!

1. Ein Template herunterladen

Zu Demonstrationszwecken verwende ich in dem Tutorial hier ein Template.
Ihr könnt es euch auch hier kostenlos herunterladen.
Nach dem Runterladen entpackt ihr das Archiv und ladet es auf euren Webserver in den Webroot.
Ihr solltet dann in etwa eine Struktur wie die folgende haben:

++ css
++ images
++ js
+ About.html
+ Contacts.html
+ Project.html
+ Projects.html
+ Sitemap.html
+ index.html

Beim Aufruf der index.html in eurem Browser solltet ihr das Template angezeigt bekommen, so dass ihr oben auf den verschiedenen Reitern herumklicken könnt (Home, About, Projects, Contacts, usw …). Über mehr müsst ihr euch erstmal keine Gedanken machen, denn das war schon der erste Schritt!

2. Die PHP-Clients herunterladen

Ladet euch die PHP Clients hier herunter und entpackt den Ordner ws-clients in euer Webserver-Verzeichnis.
Ihr solltet nun die vorherige Struktur auf die folgende erweitert haben:

++ css
++ images
++ js
++ ws-clients
+ About.html
+ Contacts.html
+ Project.html
+ Projects.html
+ Sitemap.html
+ index.html

Und das war auch schon der zweite Schritt. Einfach oder? Nach dem nächsten und letzten Schritt habt ihr bereits ein funktionierendes Kontakt Formular!

3. Die Webservice Aufrufe programmieren

Unser Webservice soll aufgerufen werden, wenn der Benutzer auf der Contacts-Seite auf den Send-Knopf unter dem Kontakt Formular drückt.

Zuerst müssen wir unser Template ein bisschen anpassen:
Öffnet die Datei Contacts.html in einem Editor.
Sucht die folgende Zeile:

<form id="ContactForm" action=""></form>

und ändert diese ab in:

<form id="ContactForm" action="doContactForm.php" method="post"></form>

Die action beschreibt, welche Datei ausgeführt werden soll, wenn auf den Knopf gedrückt wird und method=”post” bewirkt, dass das Formular als Post versendet wird.

Jetzt noch kurz die beiden Felder (Name und Email) bearbeiten:
Aus:

<input class="input" type="text" />

macht ihr:

<input class="input" type="text" name="name" />

und aus:

<input class="input" type="text" />

macht ihr:

<input class="input" type="text" name="email" />

Dies bewirkt, dass wir die Felder mit PHP auslesen können.

Jetzt kommen wir zum eigentlichen Aufruf.
Also erstellen wir wieder in unserem Webverzeichnis eine Datei mit der Endung “.php” und nennen sie einfach mal doContactForm.
Somit jetzt folgende Struktur:

++ css
++ images
++ js
++ ws-clients
+ About.html
+ Contacts.html
+ Project.html
+ Projects.html
+ Sitemap.html
+ index.html
+ doContactForm.php

Öffnet die gerade erstellte Datei in einem Editor, mit dem ihr den Quellcode editieren könnt (z.B. Notepad++, Netbeans, Eclipse, … ) und tragt folgenden Quellcode ein:

<?php
require_once 'ws-clients/ContactMessageData.php';
$name = $_POST['name'];
$email = $_POST['email'];
$msg = $_POST['textarea'];
$webservice = new ContactMessageData();
$saveContactForm = new saveContactForm();
$saveContactForm->email = $email;
$saveContactForm->nachricht = $msg;
$saveContactForm->name = $name;
$webservice->saveContactForm($saveContactForm);
?>

Eine kurze Erklärung zum Code, für diejenigen, die es interessiert:
Über den Druck auf den Knopf “Send” wurde ein Post versendet.
Auf die Daten aus dem Post kann man mittels $_POST['index'] zugreifen, wobei index durch den Namen des Feldes aus dem Template zu ersetzen ist.
Anschließend wird mit dem Aufruf new ContactMessageData() eine neue Instant der Webservice Klasse erzeugt und der Variablen $webservice zugewiesen. Hier erfolgt aber noch nicht der Aufruf, der erfolgt erst später (genauer gesagt in der letzten Zeile).
Um zu verstehen, warum dieser Aufruf genauso aussehen muss, wie er hier beschrieben ist und was die paar Zeilen vor dem Aufruf noch zu bedeuten haben, sehen wir uns zunächst einmal genauer die Beschreibung des Webservices an.
Wie wir sehen, erwartet die Methode saveContactForm einen Parameter der Form saveContactForm.
Man kann sich das wie eine “Schachtel” für die tatsächlichen Parameter vorstellen (oder für die, denen es etwas sagt, ein verschachteltes Array).
Diese Schachtel wird erzeugt (“$param = new saveContactForm();”), befüllt (“$param->contactMessage = $contactMessage;”) und anschließend in den Aufruf des Webservice übergeben (letzte Zeile).
Gar nicht so schwer, oder?
Nach dem Aufruf landen die Daten automatisch in der Datenbank der Webservice-Junkies und liegen für weitere Aufrufe für euch bereit (und nur für euch, siehe dazu auch das).

Fertig! Ihr habt jetzt folgenden Webservice aus unserem Archiv in eure Homepage eingebunden: ContactMessageData.
Beachtet, dass ihr noch eine Authentifizierung einbinden müsst!
Jetzt wisst ihr wahrscheinlich schon, wie ihr einige weitere Webservices aus dem Archiv in eure Seite bekommt.
Sollte euch aber nicht ganz klar sein, wie man nun vorgehen muss, so könnt ihr mir gerne mailen oder einfach einen Kommentar hier drunter hinterlassen.
Im nächsten Artikel machen wir an dieser Stelle weiter und ich zeige euch, wie nach dem Aufruf des Webservice nicht nur eine weisse Seite zu sehen ist und wie ihr die Daten, die eure Besucher in das Kontaktformular eintragen abrufen könnt.

Was bringt dir diese Seite?

Thema: lose gekoppelte Systeme & Webservices

Herzlich Willkommen! Du bist hier, weil du entweder

  • auf der Suche nach einer einfachen Möglichkeit bist, deine Webseite um Funktionalitäten zu erweitern
  • du lernen möchtest, eine eigene Webseite zu erstellen, im Programmieren aber noch nicht so fit bist und trotzdem keine “1 & 1 Baukasten – Homepage” haben möchtest
  • du einen Einstieg in lose gekoppelte Systeme, eine service orientierte Architektur (SOA) und Webservices suchst

Einfacher Webseiten erstellen

Unser Archiv an ständig wachsenden Webservices bietet dir eine solide Basis um zahlreiche Grundfunktionalitäten, wie z.B. eine Benutzerverwaltung, oder aber auch Tools, wie z.B. Verschlüsselung, Passwortgenerierung oder Komprimierung mit wenigen Klicks in deine Homepage einzubinden. Dabei bekommst du Hilfestellung in Form von Videotutorials und Blogartikeln, vom Einbinden der Services bis zum Aufruf. Der Vorteil hierbei liegt klar auf der Hand: Du musst dich nicht um das Programmieren und Hosten der Webservices kümmern, sondern bindest sie mit wenigen Anweisungen bequem in deine Homepage ein. Somit erhält deine Homepage einen individuellen Touch und du musst trotzdem kein “Programmierer-Guru” sein, um eine professionelle Homepage anzubieten. Das Beste daran: Das alles ist und bleibt kostenlos!

Was ist Soap und was ist ein Webservice?

Parallel zu der Serie Webservice Module, die wir hier veröffentlichen und hosten werden, gibt es einen Einstieg in die Webservice Welt mit allem was dazu gehört. Dabei richtet sich der Schwierigkeitsgrad an den Anfänger. Es werden nur grundlegende Programmierkenntnisse benötigt. Nachfolgend nur einige der Themen, die erläutert werden sollen:

  • Was ist ein Webservice? Wie erstelle ich einen Webservice?
  • Was ist SOAP? Was ist eine WSDL?
  • Wie binde ich die verschiedenen Webservices ein und wie rufe ich sie auf?
  • Was ist Maven?

Premium Service & Hosting

Neben unserem kostenlosen Angebot bieten wir für Großkunden ein Premiumangebot. Einige der vielen Vorteile hierbei:

  • Dediziertes Hosting auf einem ausgelagerten Server
  • Premium Support beim Erstellen & Einbinden der Webservices
  • Wir programmieren auf Wunsch Erweiterungen und Anpassungen der Webservices

Bei Interesse einfach eine kurze E-Mail an info@webservice-junkies.de mit einer kurzen Beschreibung des geplanten Projekts.