Wednesday, August 06, 2008

SOAP with PHP : Create Web Service using SOAP by Example

SOAP is a wonderful technology that can help you in developing great applications. In this tutorial, we will investigate the use of SOAP in PHP.

Unless you have been living in a cave somewhere without Internet access for the last few years, you have undoubtedly heard of XML, SOAP and Multi-Tiered Application Programming. If you are like many programmers, including myself, you were quite taken aback by these ideas and technologies. You may have gone so far as to simply dismiss them as irrelevant to your skill set. It's time to wake up and realize they're here to stay... and for good reason!

XML and SOAP, and in turn Multi-Tiered Programming, are technologies that can take you from being a run of the mill code hacker to a professional application developer that actually builds cool things that work and which other people can work on. These technologies enable you to build applications that separate data from presentation, keep things organized and enable your application to scale as your needs and user base increases.

If you believe like I do that the Internet is the ultimate building ground of our future, then you have to see that the 'hackish' method in which most applications for the web are built and designed is pitiful. I know that I am quite guilty of it, myself. Many times I get an itch and I just scratch it without thinking of what the future holds or the maintainability of my application. Sure the job gets done; the itch has gone away momentarily. But when the itch comes back six months down the road and I have to add or modify features, I am utterly disappointed in myself over the sorry shape of my code.

You may be asking, how can XML and SOAP help me to avoid poor application design? Well, by themselves they won't help at all. First and foremost you must get yourself into the mind set that it needs to take place. XML and SOAP are just two tools that will allow you to accomplish your goal.

Define Our Goal

Today we will build a Web Service using SOAP. In doing so, I hope that you will become familiar with the technology so that you can start incorporating it into your future applications.

Before we get too much further along, let's make sure we are all on the same footing regarding the basic terminology that we will deal with in this tutorial.

  • XML: "XML is the Extensible Markup Language. It is designed to improve the functionality of the Web by providing more flexible and adaptable information identification." (http://www.ucc.ie/xml/#acro)%br%%br%In other words, XML is a method for describing your data. For the purpose of this tutorial, we will not be directly manipulating any XML. Instead, we will examine the XML resulting from our scripts. The libraries and protocols we will use through this tutorial will handle the XML manipulation for us.%br%%br%
  • SOAP: Simple Object Access Protocol. "SOAP is a lightweight protocol for exchange of information in a decentralized, distributed environment. It is an XML based protocol that consists of three parts: an envelope that defines a framework for describing what is in a message and how to process it, a set of encoding rules for expressing instances of application-defined datatypes, and a convention for representing remote procedure calls and responses." (http://www.w3.org/TR/2000/NOTE-SOAP-20000508/) is what you are here for. We will develop both a client and a server for our SOAP service. In this tutorial, we will be using the NuSOAP library. (http://dietrich.ganx4.com/nusoap/index.php)
  • WSDL: "WSDL is an XML format for describing network services as a set of endpoints operating on messages containing either document-oriented or procedure-oriented information." (http://www.w3.org/TR/wsdl) with XML, we will not be directly any WSDL documents. The wonderful NuSOAP library will generate WSDL documents for us. What you need to know about WSDL is that it is a document that describes a Web Service. It can tell a client how to interact with the Web Service and what interfaces that Web Service provides.
  • Client: We will define a Client as a script that uses a Web Service.
  • Server: Conversely, a Server will be defined as a script that provides a Web Service.

  • Today we are going to build a Web Service that will return a stock price given a particular stock symbol. This is a classic example of where Web Services are of great use.

    You may be building an application that needs the data and could very easily just pull the data directly from your data source. Building a Web Service for it, however, allows you to give other applications easy access the same data in the future. It also separates the data extraction from the data source from the application itself. Say you were storing the data in a MySQL database but later decided to move it to a SQLite database... in this scenario your application wouldn't know the difference. Its calls to the Web Service remain unchanged.

    To provide a stock quote service you will have to have the stock prices and symbols stored in some fashion or another. This tutorial is not going to concentrate on the storage mechanism or how to obtain the prices. I will simply provide you will a table schema and some sample data to work with.

    CREATE TABLE `stockprices` (
    `stock_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    `stock_symbol` CHAR( 3 ) NOT NULL ,
    `stock_price` DECIMAL(8,2) NOT NULL ,
    PRIMARY KEY ( `stock_id` )
    );
    INSERT INTO `stockprices` VALUES (1, 'ABC', '75.00');
    INSERT INTO `stockprices` VALUES (2, 'DEF', '45.00');
    INSERT INTO `stockprices` VALUES (3, 'GHI', '12.00');
    INSERT INTO `stockprices` VALUES (4, 'JKL', '34.00');

    Create a SOAP server


    The first thing we need to do is to create the SOAP server. This is the script that will fetch the data from the database and then deliver it to the Client. One wonderful thing about the NuSOAP library is that this same Server script will also create a WSDL document for us.

    The first step is to create a function that will fetch the data we want. Create this function just as you would any other. It is just straight up PHP. The one trick is to name the function something sensible, as this will be the name that is used when the Client contacts the Server.

    function getStockQuote($symbol) {

    mysql_connect('server','user','pass');
    mysql_select_db('test');
    $query = "SELECT stock_price FROM stockprices "
    . "WHERE stock_symbol = '$symbol'";
    $result = mysql_query($query);

    $row = mysql_fetch_assoc($result);
    return
    $row['stock_price'];
    }
    ?>

    Now, it is time to turn this function into a Web Service. Basically, all we have to do is include the NuSOAP library, instantiate the soap_server class and then register the function with the server. Let's go through it step by step, after which I will present the completed script.

    The first thing necessary is to simply include the NuSOAP library.

    require('nusoap.php');

    Next, instantiate an instance of the soap_server class.

    $server = new soap_server();

    The next line is used to tell NuSOAP information for the WSDL document it is going to create for us. Specifically we specify the name of the server and the namespace, in that order.

    $server->configureWSDL('stockserver', 'urn:stockquote');

    Now, we register the function we created with the SOAP server. We pass several different parameters to the register method.

    The first is the name of the function we are registering.

    The next parameter specifies the input parameters to the function we are registering. Notice that it is an array. The keys of the array represent the names of the input parameters, while the value specifies the type of the input parameter. One thing that pure PHP programmers might find odd is that I had to specify what types my input and return parameters are with the designations of xsd:string and xsd:decimal. It is required that you describe your data properly. You are not dealing with a loosely typed language here.

    The third parameter to the register method specifies the return type of the registered function. As shown below, it is fashioned in the same way as the last parameter, as an array.

    The next two parameters specify the namespace we are operating in, and the SOAPAction. For more information on the SOAPAction see http://www.oreillynet.com/pub/wlg/2331.

    $server->register("getStockQuote",
    array('symbol' => 'xsd:string'),
    array('return' => 'xsd:decimal'),
    'urn:stockquote',
    'urn:stockquote#getStockQuote');

    Now, we finally finish it off with two more lines of code. The first simply checks if $HTTP_RAW_POST_DATA is initialized. If it is not, it initializes it with an empty string. The next line actually calls the service. The web request is passed to the service from the $HTTP_RAW_POST_DATA variable and all the magic behind the scenes takes place.

    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
    ? $HTTP_RAW_POST_DATA : '';
    $server->service($HTTP_RAW_POST_DATA);

    Here is the completed server script which I have saved in a file named stockserver.php.

    function getStockQuote($symbol) {

    mysql_connect('server','user','pass');
    mysql_select_db('test');
    $query = "SELECT stock_price FROM stockprices "
    . "WHERE stock_symbol = '$symbol'";
    $result = mysql_query($query);

    $row = mysql_fetch_assoc($result);
    return
    $row['stock_price'];
    }

    require(
    'nusoap.php');

    $server = new soap_server();

    $server->configureWSDL('stockserver', 'urn:stockquote');

    $server->register("getStockQuote",
    array(
    'symbol' => 'xsd:string'),
    array(
    'return' => 'xsd:decimal'),
    'urn:stockquote',
    'urn:stockquote#getStockQuote');

    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
    ?
    $HTTP_RAW_POST_DATA : '';
    $server->service($HTTP_RAW_POST_DATA);
    ?>

    The WSDL Document

    At this point you have a fully functioning SOAP Server. Clients can connect to it and request data. If you haven't done so already, bring up the script in your browser and see what you get. You should get a page giving you a link to the WSDL document for the Server. Click on it and you should see the resulting WSDL document. Surprise, surprise, it is in XML! If you read over this document, you will see that it describes what happens for a request and as a response for your particular SOAP Service.

    Note that while it is possible to create a SOAP Server without having it create the WSDL file, I recommend creating the WSDL document anyway. It is simple enough, so why not?

    Creating a SOAP Client


    Creating a SOAP Client to access our Server with is just as simple as creating the Server was. Understand though that the Client does not necessarily need to be a PHP Client. The SOAP Server we just created can be connected to by any type of Client, whether that be Java, C#, C++, etc.

    To create the SOAP Client, all we need to do are three things.

    First, include the NuSOAP library. This is done just as it was for the Server.

    require_once('nusoap.php');

    Secondly, we need to instantiate the soapclient class. We pass in the URL of the SOAP Server we are dealing with.

    $c = new soapclient('http://localhost/stockserver.php');

    Last make a call to the Web Service. The one caveat is that the parameters to the Web Service must be encapsulated in an array in which the keys are the names defined for the service. You will see that I have an array key named 'symbol' because that is the name of the input parameter of my function. If you remember how we specified the input parameters when we registered the function with the server, you will see that this is very similar.

    $stockprice = $c->call('getStockQuote',
    array('symbol' => 'ABC'));

    Now, here is the completed Client script, which I have saved in a file named stockclient.php.

    require_once('nusoap.php');

    $c = new soapclient('http://localhost/stockserver.php');

    $stockprice = $c->call('getStockQuote',
    array(
    'symbol' => 'ABC'));

    echo
    "The stock price for 'ABC' is $stockprice.";

    ?>
    ?>

    Creating a SOAP Client to access our Server with is just as simple as creating the Server was. Understand though that the Client does not necessarily need to be a PHP Client. The SOAP Server we just created can be connected to by any type of Client, whether that be Java, C#, C++, etc.

    To create the SOAP Client, all we need to do are three things.

    First, include the NuSOAP library. This is done just as it was for the Server.

    require_once('nusoap.php');

    Secondly, we need to instantiate the soapclient class. We pass in the URL of the SOAP Server we are dealing with.

    $c = new soapclient('http://localhost/stockserver.php');

    Last make a call to the Web Service. The one caveat is that the parameters to the Web Service must be encapsulated in an array in which the keys are the names defined for the service. You will see that I have an array key named 'symbol' because that is the name of the input parameter of my function. If you remember how we specified the input parameters when we registered the function with the server, you will see that this is very similar.

    $stockprice = $c->call('getStockQuote',
    array('symbol' => 'ABC'));

    Now, here is the completed Client script, which I have saved in a file named stockclient.php.

    require_once('nusoap.php');

    $c = new soapclient('http://localhost/stockserver.php');

    $stockprice = $c->call('getStockQuote',
    array(
    'symbol' => 'ABC'));

    echo
    "The stock price for 'ABC' is $stockprice.";

    ?>
    ?>

    There it is. It really is that simple.

    Conclusion

    Hopefully after reading through this tutorial you have an understanding of how simple it is to create a SOAP Server and Client with NuSOAP. It simply astonished me how utterly simple it was after I actually took a look at it! Before I ever laid eyes on it I had dreams of a complex system that would take months to utilize. Luckily, NuSOAP came along and made that task simpler than anyone could ever ask for.

    As you can see, SOAP is a wonderful tool for separating your application into smaller more manageable pieces. Do realize that SOAP isn't the cure all for everything. Its overuse is just as bad as any other poor design. The key to a good application design is patience and planning. Sit down, take out the old pencil and paper and write things down. Understand what you are really getting yourself into and ask lots of 'What If' questions. Think about the future of the application and ask yourself about the different ways it may be used in the future. The number one pitfall of application design is painting yourself into a corner. If you just thought about it ahead of time you could have started at the other side of the room.



    36 comments:

    Abid's Adsense Treasure Website Package said...

    ===>> http://www.abid.in

    Here's your chance to make $40,000 per month with
    Adsense by being lazy.....


    Wanna Find out How I, By Being a Lazy Ass Make $40,000/Month
    (Yep, that's 40,000 USD) Every Month Like Clockwise From My Web.site.


    ===>> http://www.abid.in

    The Website Is.

    * Highly Optimized
    * Content Rich
    * Profit Pulling
    * Fully Automated

    Here's What You Get:

    A Huge Money Making Website
    Integrated with Adsense ads,
    dynamic feeds and over a thousand content pages.


    My Free Traffic Report
    Methods I use to get a lot of traffic, almost instantly.

    Free Email Tips
    You will get some EXTRA tips on promoting your new website by email.

    Setup and Hosting Help
    Even though you get full easy to follow setup instructions.
    If you still have trouble you can contact us
    we will set up and host your website for you.


    ===>> http://www.abid.in

    As an special offer, I am offering my complete Adsense Treasure System A fully automated website which makes you money while you sleep.

    Finally a tool for you to make some serious money.

    Get Your Copy Now... Click here

    ===>> http://www.abid.in

    Ready Made Website






    Shah Rukh Khan

    Bollywood

    ShahRukhKhan



    India's Online Shopping Mall

    Online Shopping Mall

    Buy Online


    Link Directory
    The Most Responsive FREE Safelist
    Make Money Online
    Master Resell Rights eBooks
    Bollywood Sargam

    nerijus said...

    I found a page how to use AJAX and SOAP: Introduction to Ajax

    miyuki said...

    ed hardy clothing Online Store - We wholesale and retail cheap ed hardy shirts
    g including Ed Hardy Men's Clothing, ed hardy womens Clothing,Ed Hardy Kids Clothing, Ed Hardy Sunglasses, Ed Hardy Swimwear and more.

    miyuki said...

    A study last yearnike tn, the author in the essay read NIKE , a reporter at the Shanghai headquarters in an interview, nike chaussuressee a pr in high school to read a league plans, employees interviewed told reporters in Beijing's streets, they children to interview, the children said, "truly understand them." tn chaussures These words, if the author touches product function, brand spirit and culture is to become part of the consumer of two basic methods

    miyuki said...

    puma basketBlack is lubricious, can match, but young people don't want to match with brunetpuma femmes, can try even cardigan knitting coat will appear lively cap. Boys and girls, puma CATcan choose to choose self-cultivation

    miyuki said...

    nike max shoes, one of the world's three major brands of Puma shoes, will build its factory in Lanshan county next year, Hunan province. Taiwan Diamond Group of Footwear production chooses its base in Lanshan county, which is one of top 500 companies in the world.mens clothing men's sweate, cheap columbia jackets, lacoste sweater, ralph lauren polo shirts,ski clothing. Free Shipping, PayPal Payment. Enjoy your shopping experience on mensclothingstore.Us

    miyuki said...

    Paypal payment. Free shipping. cheap ugg boots ,UGG Online Store,australian cheap ugg boots ,ugg boots australia,UGG Online Store,black ugg boots,ugg boots on sale,cheap uggs. Very Cheap!Vente en ligne de discount chaussure sport : chaussure puma, chaussure nike, chaussure tn, nike tn,nike requin, puma future cat, nike shox torch, ugg boots et plus.

    swimingfidh said...

    There are ed hardy shirts
    ,pretty ed hardy shirt for men,

    ed hardy womens in the ed hardy online store

    designed by ed hardy ,
    many cheap ed hardy shirt ,glasses,caps,trouers ed hardy shirts on sale ,

    You can go to edhardyshirts.com to have a look ,you may find one of ed hardy clothing fit for you
    men's jacketcheap jacketnorth face jacketsghd hair straightenerscheap ghd hair straightenershair straighteners

    j said...

    ralph lauren poloburberry polo shirtthe north face jacketcolumbia jacketspyder jacket

    j said...

    Modern tennis racquet in the manufacturing sector have been in use for close to the aerospace industry and military-industrial material products. Over the past two decades, metal materials and chemical materials to upgrade the high level of tennis racket manufacturer has laid a solid foundation. In today's big brands have more than tennis: Head junior tennis racket,Wilson tennis racquet, Wilson tennis racket,Head tennis racket,Babolat tennis racket......

    aelina said...

    Can you provide more information on this? I am new to the subject. Please come visit my site Yellow Pages South Dakota when you got time.

    aelina said...

    Very nice information. Thanks for this. Please come visit my site Yellow Pages Tennessee when you got time.

    poll said...

    You share valuable information and excellent design you got here! I would like to thank you for sharing your thoughts and time into the stuff you post!! Thumbs up. Please come visit my site Sacramento Business Directory when you got time.

    poll said...

    I was thinking of looking up some of them newspaper websites, but am glad I came here instead. Although glad is not quite the right word… let me just say I needed this after the incessant chatter in the media, and am grateful to you for articulating something many of us are feeling - even from distant shores. Please come visit my site
    Santa Ana Business Directory
    when you got time.

    julia said...

    Hello mate, I want to thank you for this nice blog. Would you mind telling me some secrets for a succesful blog ? Which could attract some visitors than it normally does. Please come visit my site Fremont California Business Directory when you got time.

    julia said...

    What a facinating article. I’m looking for a marketing expert to help with a project, could you help? Please come visit my site Irvine California Business Directory when you got time.

    J&D said...



    辣妹視訊|美女視訊|視訊交友網|視訊聊天室|視訊交友|視訊美女|免費視訊|免費視訊聊天|視訊交友90739|免費視訊聊天室|成人聊天室|視訊聊天|視訊交友aooyy
    哈啦聊天室|辣妺視訊|A片|色情A片|視訊|080視訊聊天室|視訊美女34c|視訊情人高雄網|視訊交友高雄網|0204貼圖區|sex520免費影片|情色貼圖|視訊ukiss|視訊ggoo|視訊美女ggoo|

    080苗栗人聊天室|080中部人聊天室ut|ut影音視訊聊天室13077|視訊做愛|kk777視訊俱樂部|上班族聊天室|聊天室找一夜|情色交友|情色貼片|小瓢蟲情色論壇|aio交友愛情館|

    哈拉聊天室|洪爺影城|kk123視訊俱樂部|6K聊天室|正妹視訊

    情趣用品|情趣用品|情趣用品|情趣|情趣用品|情趣

    pimpinkicks said...

    Me and my friend were arguing about an issue similar to this! Now I know that I was right. lol! Thanks for the information you post. Please come visit my site North Carolina when you got time.

    pimpinkicks said...

    What a blog filled with vital and important information this is .. It must have taken a lot of hours for you to write these yourself. Hats off from me for your hard work. Please come visit my site search engine when you got time.

    julia said...

    I usually don’t leave comments!!! Trust me! But I liked your blog…especially this post! Would you mind terribly if I put up a backlink from my site to your site? Please come visit my site youth organizations when you got time.

    julia said...

    I enjoyed reading your work! GREAT post! I looked around for this… but I found you! Anyway, would you mind if I threw up a backlink from my site? Please come visit my site event calendar listing when you got time.

    Maical clark said...

    I usually don’t leave comments!!! Trust me! But I liked your blog…especially this post! Would you mind terribly if I put up a backlink from my site to your site? Please come visit my site Mortgage when you got time. Thanks.

    Maical clark said...

    Wow! Thank you! I always wanted to write in my site something like that. Can I take part of your post to my blog?
    Please come visit my site Fire Protection when you got time. Thanks.

    Peejay Li said...

    Thank you for sharing such a nice article.
    chaussures puma
    puma speed cat
    Nike Tn Chaussures
    requin tn
    nike shox
    puma shoes
    puma CAT
    puma basket
    puma speed
    baskets puma
    puma sport
    puma femmes
    puma shox r4 torch
    nike air max requin
    nike shox r3
    shox rival r3
    tn plus
    chaussures shox
    nike shox r4 torch
    air max tn requin
    nike tn femme
    pas cher nike
    tn chaussures
    nike rift
    nike shox nz
    chaussures shox
    nike shox rival
    shox rival
    chaussures requin
    jeans online
    cheap armani jeans
    cheap G-star jeans

    lucyliu said...

    nike air max 90
    nike air max 95
    nike air max tn
    nike air rift
    nike shox r4
    nike air max 360
    nike shox nz
    puma mens shoes
    puma shoes
    puma speed
    nike shoes
    nike air
    nike air shoes
    puma cat
    air max trainers
    mens nike air max
    nike shoes air max
    nike shoes shox
    air shoes
    nike shoe cart
    puma future
    cheap puma
    sports shoes
    nike air rifts
    nike air rift trainer
    nike air
    nike rift
    nike rift shoes
    cheap nike air rifts
    bape shoes
    jeans shop
    diesel jeans
    levis jeans

    Sneakers hobbies said...

    nice post!!
    Welcome to visit our very professional online outlet,we major sell authentic brand polo shirts wholesale ski clothing and winter clothes
    spyder jacket is the the one of the best ski clothes ,if you like skiing and need cheap spyder jackets ,please contact us,we always supply discount spyder jacket for you!

    uwanna said...

    Gucci
    Gucci shop
    Gucci bags
    Gucci shoes
    Replica GUCCI SHOES
    wholesale gucci shoes
    cheap Gucci handbags
    Gucci ON sale
    Gucci Belts
    Gucci small accessories
    Gucci hats & scarves
    Gucci wallets
    Gucci Handbags
    Women Gucci shoes
    Men Gucci shoes
    discount gucci shoes
    cheap Gucci shoes

    uwanna said...

    gucci replica handbags
    men gucci shoes
    Gucci men sneakers
    Gucci men moccasins
    gucci women sneakers
    gucci women boots
    Gucci men boots
    Gucci
    Gucci shop
    Gucci bags
    Gucci shoes
    Replica GUCCI SHOES
    wholesale gucci shoes
    cheap Gucci handbags
    Gucci ON sale
    Gucci Belts
    Gucci small accessories
    Gucci hats & scarves
    Gucci wallets
    Gucci Handbags
    Women Gucci shoes
    Men Gucci shoes
    discount gucci shoes
    cheap Gucci shoes

    ally said...

    Apart from these military fashion tops and ripped and torn jeans are also hip and happening this seasonwholesale LV handbags
    monclerdiscount moncler jacketsmoncler coatsmoncler vestmoncler outletmoncler t-shirtmonclermoncler jacketsnew moncler coats
    moncler vestmoncler outletmoncler polo t-shirtCoach handbags outletCoach TotesCheap Coach handbag 2010Discount Coach hand bagAuthentic Coach handbagNewest Coach handbags outletcoach outletLouis Vuitton TotesLouis Vuitton handbagsLV handbags 2010Discount LV handbagsCheap Louis Vuitton Outletnewest Louis Vuitton handbagscheap rain weardiscount rainweardog rain jacketscolorful rain bootsrainboots outletCheap Ture Religion Jeans outletDiesel JeansLevis JeansWholesale Ed Hardy JeansDiscount Dior Jeans outlet
    cheap abercrombie fitch clothingdiscount abercrombie fitch T-shirtsdiscount abercrombie and fitch hoodiesabercrombie fitch outletwholesale abercrombie fitched hardy wholesaleLeather jackets are a must in the wardrobe this season.

    ally said...

    In the casual attire category tracksuits and tank tops rule for men.discount ed hardy wholesalewholesale ed hardyed hardy outlet5230583358185899Bailey Button 5803Classic Cardy 5819Classic Mini 5854Classic Short 5825Classic Short 5825 New*Classic Tall 5815Metallic Classic Tall 5812Nightfall-5359Sundance -5325Ultra Short - 5225Ultra Tall-5245women's leather hangbagsdiscount abercrombie and fitch outlet
    discount abercrombie outletdiscount abercrombie clothingdiscount abercrombie jacketdiscount abercrombie shirtdiscount abercrombie and fitch outletdiscount bercrombie and fitch clothesdiscount abercrombie and fitch hoodiediscount abercrombie and fitch shirtsdiscount abercrombie fitch jacketBesides, the urban trend, vintage clothing will also rule this season.

    janewangleilei said...

    You can have a look at it.
    jordan shoes
    jordan ajf shoes
    There are cheap shoes to choose
    jordan 6
    jordan 7
    Good quality with low price.
    air jordan 2010
    Air Jordan 2009
    If you like,you can contact us.
    jordan 3
    jordan 4
    We offer different styles.
    jordan 1
    jordan 2
    Thanks.
    jordan 5
    jumpman
    famous brand!
    newest jordans
    air yeezy
    I can't believe it.
    nike outlet
    You can have a look at it.
    adidas outlet
    puma outlet

    hxl said...

    baby bedding
    bed in a bag
    sexual health
    health plan
    beauty cosmetics
    skin care
    health fitness sports
    mens health
    fashion shoes reviews
    best air shoes
    best women shoes
    fashion dress
    comfortable man shoes
    fashion shoes
    sneakers reviews
    top ten boots
    boots of world
    rosetta stone
    boots classic
    wholesale lots
    china wholesaler
    china wholesale
    wedding dress
    lightinthebox reviews
    fashion shoes

    健康365

    加拿大营养屋

    健康药品大全

    健康365

    欣乐佳

    中食月太

    vishal said...

    Easy Earning money in online never been this easy and transparent.
    You would find great tips on how to make that dream amount every Day.
    Sitting in the home earn around $100 perday. So go ahead and
    click here
    for more details and open floodgates to your online income. All the best.

    Thanks.

    aa said...

    情趣用品,情趣,飛機杯,自慰器,自慰套,充氣娃娃,
    電動按摩棒,按摩棒,跳蛋,AV,
    C字褲,情趣睡衣,丁字褲,震動環
    情趣用具,lelo,TENGA,sm,
    角色扮演,

    duckless said...

    The original chi flat iron was released as a professional salon straightener. After gaining popularity on the market the cheap chi flat iron was later released for personal consumer use. If you are a professional stylist or someone who loves straightening their chi hair straightener before leaving for work the Chi original ceramic flat iron is one styling tool you cannot live without. Unlike other wholesale chi flat iron before its day the Chi model was developed with moist ceramic heat technology that does not burn or damage the wholesale chi hair straighteners.

    boby said...

    The Coach products include women's handbags, purses, men's handbags, Coach Purses business packet, and suitcase and so on. And with a new series of products developed, Coach Handbagsthe Coach is expanding its influence now. Such as Coach purses, the series of Coach purses express happiness. No matter the purses adopt gold or combination of gold and black, they display elegant temperament and release happiness in the holiday atmosphere. In addition, circular metal coils which attach on the surface of purses show some naughty. Coach Outlet Stores