Working with RESTful Services in CodeIgniter

Working with RESTful Services in CodeIgniter

CodeIgniter is becoming well known for its power as a PHP based web application framework, but it’s not often that we see examples of it being used for anything else. Today we’ll learn how we can use CodeIgniter to create a RESTful API for your existing web applications, and demonstrate how to interact with your own API or other RESTful web-services, such as Facebook and Twitter.

Tutorial Details

Introduction

If you have been following the CodeIgniter From Scratch series you will know by now that it is relatively quick and easy to put together simple web applications, such as blogs, CMS systems, brochure sites, etc. One thing you may not have thought about is using CodeIgniter to create an interactive API. After trying several existing REST implementations, I found they not only lacked simplicity but were missing most of the features you would expect from a RESTful implementation; so I built my own. This tutorial will show you how to use this code to set up your REST API, and gives example of how to interact with it from your web application.

Assumptions

  1. You have a web server set up, locally or online and known how to manage files on it.
  2. You have read a few of the CodeIgniter from Scratch tutorials.
  3. You know how to set up CodeIgniter.
  4. You know a little about RESTful services.

This tutorial is broken down into two parts. We will start by learning how to create a RESTful service, then further down, we will learn how to interact with it in a few different ways.

Part 1 – Creating a RESTful API

Step 1: Setting up the Demo

Firstly you need to download the codeigniter-restserver code from GitHub and extract it and move the code to your server.

When you open the folder, you will see an entire CodeIgniter install, which is there to power the demo. This allows people to have a play with the REST demo before integrating with your existing application.

Open up “application/config/config.php” and set the base_url to get links working. This base_url will be different for everyone and depends entirely on where you uploaded your files.

Step 2: The URLs

With the files extracted and the base_url set, we are ready to load up our RESTful CodeIgniter installation, and have a look at the demo supplied with it. Browse the base URL, which by default is:

http://localhost/restserver

Here you will find a few example links to the example_api controller, which can be found at “application/controllers/example_api.php”. Let’s dissect the URL’s of these examples to see what is going on. The first URL is a very simple one.

This URL looks very much like any other CodeIgniter URL with a controller and a method, but you will notice in this diagram that the method is named a “Resource”. REST is all about Resources and they are essentially a noun within your application, which are interacted with (i.e added, deleted, edited, queried) based on HTTP headers and URL query strings or HTTP arguments.

The default format for output is XML which is what we see in this basic example. The other links are slightly larger and demonstrate how to pass parameters and show how the output format can be modified in the URL:

Normally in CodeIgniter, you just pass in parameter values, but a REST controller accepts any number of parameters in any order. For this to work, we need to pass in the name of the parameter followed by the value in pairs.

At the end of the URL is the “format” parameter. This is a reserved parameter that will modify the output format of the requested data like so:

By giving both the API developer and the client application the choice of data formats to use, the API is opened up to a much wider audience and can be used with more programming languages and systems. These three are not the only formats supported, out of the box your REST API can use:

  • xml – almost any programming language can read XML
  • json – useful for JavaScript and increasingly PHP apps.
  • csv – open with spreadsheet programs
  • html – a simple HTML table
  • php – Representation of PHP code that can be eval()’ed
  • serialize – Serialized data that can be unserialized in PHP

While adding the format to the URL is not technically the most RESTful way to change formats, it allows for easy browser testing and lets developers without cURL perform simple GET requests on the API. The more RESTful way is to send a Content-type HTTP header to the REST controller using cURL, but that will be explained later.

Step 3: The Code

Now if you open up application/controllers/example_api.php you will immediatley spot a few differences from normal CodeIgniter controllers.

REST_Controller

In the MVC pattern, a controller is the central point of the logic. It is called when a user makes a request and then based on the logic in the controller it fetches data and outputs views. CodeIgniter contains its own logic for how a Controller should work, but as we are doing something different we need our own REST_Controller library to contain its own REST related logic. So instead of simply using:

<?php
class Example_api extends Controller {

}

…you will need to use:

<?php
require(APPPATH'.libraries/REST_Controller.php');

class Example_api extends REST_Controller {

}

Working with Resources

Now your empty controller is set up, next are the methods or “resources”. This is prossibly the most confusing part of the tutorial if you are used to how CodeIgniter works. Basically, you take the Resource and the HTTP verb and combine them to make a method name. So the two examples we looked at before had a Resource of user and users. Because both of these were loaded in the browser, we know it was using a GET request and so the two methods below are used:

<?php
require(APPPATH'.libraries/REST_Controller.php');

class Example_api extends REST_Controller {

    function user_get()
    {
		// respond with information about a user
    }

    function users_get()
    {
		// respond with information about several users
    }
}

This may seem a little strange, but it gives you the ability to use the same URL and respond to the request depending on the HTTP verb that has been used. If somebody tries to access your API in a way that is not allowed (in this example PUT or DELETE) it will simply respond with a 404. If you aren’t sure about HTTP verbs, let me explain.

GET

Used to fetch information about an existing resource. This is used by browsers when you enter a URL and hit go, or when you click on a link, so it perfect for fetching information on one of your REST resources (like user).

POST

Used to update an existing resource with information. Browsers use this to submit most types of forms on the internet, although some use GET as well by submitting the form action with a query string containing the field data.

PUT

Less commonly used and not supported by most browsers, PUT is used to create a new resource.

DELETE

Also not used by many browsers, this HTTP verb rather obviously is used to delete a resource.

If we put that into code and allow each verb on the resource user it would look like this:

<?php
require(APPPATH'.libraries/REST_Controller.php');

class Example_api extends REST_Controller {

    function user_get()
    {
		// respond with information about a user
    }

    function user_put()
    {
		// create a new user and respond with a status/errors
    }

    function user_post()
    {
		// update an existing user and respond with a status/errors
    }

    function user_delete()
    {
		// delete a user and respond with a status/errors
    }
}

Accessing parameters and returning data

So now the API has been given its structure by setting up the resources and defining a method for each HTTP verb we wish to support; we need parameters so we can use our CodeIgniter models and libraries. This is one of the major benefits of using CodeIgniter for our API, as we can use our existing models and libraries and not have to re-code them.

<?php
require(APPPATH'.libraries/REST_Controller.php');

class Example_api extends REST_Controller {

    function user_get()
    {
		$data = array('returned: '. $this->get('id'));
		$this->response($data);
    }

    function user_post()
    {
		$data = array('returned: '. $this->post('id'));
		$this->response($data);
    }

    function user_put()
    {
		$data = array('returned: '. $this->put('id'));
		$this->response($data;
    }

    function user_delete()
    {
		$data = array('returned: '. $this->delete('id'));
		$this->response($data);
    }
}

This example contains five new pieces of code:

$this->get()

Is used to return GET variables from either a query string like this index.php/example_api/user?id=1 or can be set in the more CodeIgniter’esque way with index.php/example_api/user/id/1.

$this->post()

Is an alias for $this->input->post() which is CodeIgniter’s method to access $_POST variables with XSS protection.

$this->put()

Reads in PUT arguments set in the HTTP headers or via cURL.

$this->delete()

You guessed it, this reads in DELETE arguments, also set in HTTP headers or via cURL.

$this->response()

Sends data to the browser in whichever data format has been requested, or defaults to XML. You can optionally pass a HTTP status code to show it has worked or failed. E.g if the ID provided was not in the database, you could use $this->response(array(‘error’ => ‘User not found.’), 404);

Step 4: Working with your Models

Until now, we have been working with an example API in a clean install. So the next step is to get a REST API running from your existing codebase.

Although the download comes with a full CodeIgniter installation for the demo and to allow API’s to be built from scratch, the only two files of importance are:

  1. application/config/rest.php
  2. application/libraries/REST_Controller.php

Drop those two files into your CodeIgniter application and create a new API controller.

<?php
require(APPPATH.'/libraries/REST_Controller.php');

class Api extends REST_Controller
{
	function user_get()
    {
        if(!$this->get('id'))
        {
        	$this->response(NULL, 400);
        }

        $user = $this->user_model->get( $this->get('id') );

        if($user)
        {
            $this->response($user, 200); // 200 being the HTTP response code
        }

        else
        {
            $this->response(NULL, 404);
        }
    }

    function user_post()
    {
        $result = $this->user_model->update( $this->post('id'), array(
        	'name' => $this->post('name'),
        	'email' => $this->post('email')
        ));

        if($result === FALSE)
        {
        	$this->response(array('status' => 'failed'));
        }

        else
        {
        	$this->response(array('status' => 'success'));
        }

    }

    function users_get()
    {
        $users = $this->user_model->get_all();

        if($users)
        {
            $this->response($users, 200);
        }

        else
        {
            $this->response(NULL, 404);
        }
    }
}
?>

This shows an example API with some generic model names. In the first method, we are picking up a ?id=XX and passing it to the model. If data is found we send it to the $this->response() function with a status 200. If nothing is found, return no body and a 404 to say nothing was found. You can imagine how this could be expanded to run all sorts of API activities for your web application.

Step 5: Securing the API

Now your API is built it needs securing so only users given access can interact with the API. To set the login type, usernames and passwords open up “application/config/rest.php” inside your codebase.

/*
|--------------------------------------------------------------------------
| REST Login
|--------------------------------------------------------------------------
|
| Is login required and if so, which type of login?
|
|	'' = no login required, 'basic' = relatively secure login, 'digest' = secure login
|
*/
$config['rest_auth'] = 'basic';

None

Anyone can interact with any one of of your API controllers.

Basic

A relatively insecure login method which should only be used on internal/secure networks.

Digest

A much more secure login method which encrypts usernames and password. If you wish to have a protected API which anyone could get at, use digest.

/*
|--------------------------------------------------------------------------
| REST Login usernames
|--------------------------------------------------------------------------
|
| Array of usernames and passwords for login
|
|	array('admin' => '1234')
|
*/
$config['rest_valid_logins'] = array('admin' => '1234');

Setting up the users is simple. Each login is an array item, with a key and a value. The key is the username and the value is the password. Add as many as you like to this array and dish them out to anyone who will be using the API.

Part 2 – Interacting with RESTful Services

Whether it is the API you have just built or a public service such as Twitter, you will want to be able to interact with it somehow. Seeing as RESTful services work with basic HTTP requests it is very easy to do this in a number of different ways.

Different Methods to Interact with REST

Each of these different interaction methods will be shown with the code placed directly in the Controller methods. This is purely so the demos are easier to read and would normally would be placed inside a model or a library for correct MVC separation.

file_get_contents()

Using the very simple PHP function file_get_contents(), you can perform a basic GET request. This is the most basic of all the methods but is worth mentioning for those “quick and dirty” moments.

$user = json_decode(
	file_get_contents('http://example.com/index.php/api/user/id/1/format/json')
);

echo $user->name;

It’s worth noting that, while this method will not work using HTTP Digest authentication, if you are using HTTP Basic authentication you can use the following syntax to get data from your password protected RESTful API:

$user = json_decode(
	file_get_contents('http://admin:[email protected]/index.php/api/user/id/1/format/json')
);

echo $user->name;

There are a few problems with using this method: the only way to set extra HTTP headers is to set them manually using the PHP function stream_context_create(), which can be very complicated for developers who are new to the internal workings of HTTP requests. Another disadvantage is that you only receive the body of the HTTP response in its raw format, which means you need to handle conversion from very single request.

cURL

cURL is the most flexible way to interact with a REST API as it was designed for exactly this sort of thing. You can set HTTP headers, HTTP parameters and plenty more. Here is an example of how to update a user with our example_api and cURL to make a POST request:


    function native_curl($new_name, $new_email)
    {
	    $username = 'admin';
		$password = '1234';

		// Alternative JSON version
		// $url = 'http://twitter.com/statuses/update.json';
		// Set up and execute the curl process
		$curl_handle = curl_init();
		curl_setopt($curl_handle, CURLOPT_URL, 'http://localhost/restserver/index.php/example_api/user/id/1/format/json');
		curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl_handle, CURLOPT_POST, 1);
		curl_setopt($curl_handle, CURLOPT_POSTFIELDS, array(
			'name' => $new_name,
			'email' => $new_email
		));

		// Optional, delete this line if your API is open
		curl_setopt($curl_handle, CURLOPT_USERPWD, $username . ':' . $password);

		$buffer = curl_exec($curl_handle);
		curl_close($curl_handle);

		$result = json_decode($buffer);

		if(isset($result->status) && $result->status == 'success')
		{
			echo 'User has been updated.';
		}

		else
		{
			echo 'Something has gone wrong';
		}
    }

Interacting with your API this way works fine, but there are two problems with this method:

  1. It uses an ugly confusing syntax – imagine creating several an application based on that.
  2. cURL is not installed on all servers by default.

To solve this ugly syntax, a cURL library has been developed for CodeIgniter which simplifies things immensely.

The exact same request made with the cURL library would look like this:

    function ci_curl($new_name, $new_email)
    {
	    $username = 'admin';
		$password = '1234';

		$this->load->library('curl');

		$this->curl->create('http://localhost/restserver/index.php/example_api/user/id/1/format/json');

		// Optional, delete this line if your API is open
		$this->curl->http_login($username, $password);

		$this->curl->post(array(
			'name' => $new_name,
			'email' => $new_email
		));

		$result = json_decode($this->curl->execute());

		if(isset($result->status) && $result->status == 'success')
		{
			echo 'User has been updated.';
		}

		else
		{
			echo 'Something has gone wrong';
		}
    }

Much nicer to look at right? Well there is an even easier method to work with REST in your CodeIgniter applications that this.

REST client library

A REST client library has been developed that sits on top of this cURL library which handles format conversion, HTTP logins and several other aspects of your REST API.

    function rest_client_example($id)
    {
		$this->load->library('rest', array(
			'server' => 'http://localhost/restserver/index.php/example_api/',
			'http_user' => 'admin',
			'http_pass' => '1234',
			'http_auth' => 'basic' // or 'digest'
		));

        $user = $this->rest->get('user', array('id' => $id), 'json');

        echo $user->name;
    }

Here you can see we are making a GET request, sending id as a parameter and telling the library we want ‘json’ as the content format. This handles the setting of Content-type for you, and converts the data into a PHP object for you. You can change this value to ‘xml’, ‘json’, ’serialize’, ‘php’, ‘csv’ or any custom MIME-type you like, for example:

	$user = $this->rest->get('user', array('id' => $id), 'application/json');

As you have probably guessed as well as $this->rest->get(), the library also supports $this->rest->post(), $this->rest->put(), $this->rest->delete() to match all of your REST_Controller methods.

You will need to var_dump() results coming from the REST client library to make sure you are getting the right data format back. The conversion will somtimes be array and sometimes be an object, depending on how it is converted by PHP. If the returned MIME-type is not supported then it will simply return the format as plain-text.

Talking to Twitter

Using this REST library you can talk other RESTful services such as Twitter and Facebook. Here is a simple example of how you can get details for a specfic user based on their ID, using Twitter’s default format XML.

        $this->load->library('rest', array('server' => 'http://twitter.com/'));

        $user = $this->rest->get('users/show', array('screen_name' => 'philsturgeon'));
        $this->load->library('rest', array(
        	'server' => 'http://twitter.com/',
			'http_user' => 'username',
			'http_pass' => 'password',
			'http_auth' => 'basic'
        ));

        $user = $this->rest->post('statuses/update.json', array('status' => 'Using the REST client to do stuff'));

Looking at this, you will notice that interacting with the Twitter API is a bit different in a few ways.

  1. They support URL based format switching in the form of .json instead of /format/json. Some require an extension, some do not; so it’s best to always add them.
  2. They mostly only support GET/POST, but are starting to add more DELETE methods
  3. They don’t always have just a resource in their URL, for example: users/search is one REST method, but lists is another.

Keep an eye out for these differences as they can catch you out. If you get stuck, simply echo $this->rest->debug() for a whole range of information on your REST request.

Summary

Combining what you now know about RESTful services, the CodeIgniter REST client library and the Twitter API documentation – or any other RESTful API documentation for that matter – you can create some very powerful applications that integrate with any custom or public web service using REST. You can extend your API by creating more REST_Controller’s and even make a modular API by using Matchbox or Modular Separation to create an api.php controller for each module to help keep your API as neatly organized as your application.

Write a Plus Tutorial

Did you know that you can earn up to $600 for writing a PLUS tutorial and/or screencast for us? We’re looking for in depth and well-written tutorials on HTML, CSS, PHP, and JavaScript. If you’re of the ability, please contact Jeffrey at [email protected].

Please note that actual compensation will be dependent upon the quality of the final tutorial and screencast.

Write a PLUS tutorial



Classified Ads Php.ajax

Classified Ads Php.ajax
Befor read description please download and see atachment..
Complete info is in atachment..
You may use any open source script or edit from any other script for my requirments…please put your bid and let me know if you have demo already
This script is simple Classified Ads and have 5 important section
1.Ad view page ..that show and ad when people click on title(check ad view.jpg)
2.Ad list.that show all ads in a category with pagination(check ad list.jpp)
3.post ad page that visitor can write name and ads info with price to post thire ads.(post ad.jpg)
4.Review ads befor post page that uset check thiere info befor sending the ad.
5.send mail page..that buyer can contact with ad poster to shop thiere good..

Another function are normal functions like other Classified site,like send notifaction email to seller about thiere ads info…number of ads view,date of post and like these.

Also all things are categorise by country and city..people will choose a country from index page and just see ads in country thay choosed..

header and footer shoulde be make like atachment.check images please.

Payment option in post ad page can be choose by user.paypal and some other option are ok..

Also allthing shoulde be edit from admin panel.like:add category,sub category.subsub category..add country ,,add city ..price …admin may choose free mode ,that allthing be free for user for limited time…

Design need to be like atachment…

use ajaz for male and image of ads,for fast loading page..

During job i will tell if some thing may be add or change..but most of them are this you see now..

Also make posible language files.so i can translate it and add other languages later

Rush Penny Auction Editor Fix

Rush Penny Auction Editor Fix
Ok I have a Penny Auction www.BiteAWin.com and I had someone from ebay install the script to my webhost and my domain, The problem Im having is that I get an error message when someone try’s to sign up and also when someone send me a message or when someone clicks on the forgot password button and it will not send it to there email,on my contact page I never recieve the email and it could be because the default email is not right or something. But anyways the guy that installed my script said that the config.php file needs to be updated with your webhosting smtp settings for your particular account or re write the script.
So the 3 things I need fixed are the Sign up page gives me an error, Contact page I never recieve the message in my email and When someone clicks on the forgot password they never get an email for there password.
I will contact the person that I choose and I will give them my phone # to clearify on what I want done and the work I want done is done. So you must be able to contact me on the phone and must speak clear english.
If I am very satisfied with your work I may ask you at a later time to do some work on my other website projects, as I would like a proffesinal job done.

Any bids that are over my budget will not be accepted as I am low on funds so thats my final budget price.
When you PMB me please include the the items that I need fixed so that I know that you read my whole post.
I need this done as soon as possible, Because I will like to get the site running soon.

Site To Use Amazon S3

Site To Use Amazon S3
I have a stock photo website. It has about 1200 images currently, and they are taking up about 5GB of space on my server. The server is on shared hosting, and I cannot afford a dedicated server until the site has grown much larger.

I signed up for an Amazon S3 account, and I want to use that to store all the images. Right now, when someone uploads an image, the script makes a folder with a number in the /content directory. I would like to make it so that when someone uploads an image, the image is transferred to my S3 account, and when the site is viewed, it pulls the images from there. This will cut down on space and bandwidth usage for my server.

You will need to help integrate the S3 service into the current site. I can transfer the current images there, but I need you to make it so that whenever a new image is uploaded, it will be put on the S3 server.

The site URL is in the PMB.

You will need to show me what you have changed so that in the future I can change it back if necessary.

Vbulletin Q&a Module Plug-in

Vbulletin Q&a Module Plug-in
vBulletin 3.8.4

I want a plug-in that allows users to easily submit a new Question, and allows other users to easily answer that question.

A list of the top 10 questions will be displayed via a template hook ($qaboard). It will also have a small form so logged-in users can post a new question and hit Submit.

– Template hook ($qaboard) so I can place it where I want it
– When user submits a new question, it creates a new thread in a specified forum (controllable via AdminCP).
– Any user can browse that forum and answer questions just like normal.
– Each question on the Q&A board is linked to the thread, making it easier to view/answer.
– Three view/filter options for Top 10 board. Checkbox to enable/disable viewing unanswered questions (open threads are unanswered, closed threads are answered – staff will control this). Drop down to sort by popularity (# of views on thread) or sort by date (most recent questions).

You can see a rough idea at TomsHardware in this screen shot:
http://screencast.com/t/OWZjOTg0ZDc

Mike

Joomla Project – Fishing Trip

Joomla Project – Fishing Trip
I am programmer who is working on the website fishfromit.com. The website is an informational website for fishing and it includes a listing of fishing trips. Users can search for and book fishing trips online. (This is similar to expedia.com or travelocity.com, but all the trips are fishing related).

I need to find a programmer who can help me finish some items that I do not have time to complete.

1) Fishing Trip Search and Reservation Engine
We have purchased Reservation Manager Pro. http://webformatique.com/reservation-manager-pro.html. This is a listing and reservation component for hotel rooms. We need to customize this component so that it works for fishing trips…create new custom fields. I will upload documentation showing all the required changes shortly.

Persons that are Fishing Guides (Joomla user type) would be able to manage their own listings. Add listings, edit listing and delete listings.

2) Fishing Guide/Fishing Company Search Engine
We also need a tool that will allow users to search Fishing Guides…search for and locate guides based on criteria they specify.

3) Fishing Guides/Fishing Companies Display Page
There needs to be a “landing” page for each Fishing CGuide/Company. Display their bio, photo and upcoming trips.

I envision using Res Manager Pro to complete all of the above. However, I am open to different ideas. For instance, we have also purchased and installed JomSocial. If anyone has any suggestions regarding better components that we could use, please let me know.

For your initial response please provide:

1) Pricing. This will most likely change once the document with the complete specs is uploaded.

2) Examples of Joomla components you have worked with and customized in the past.

3) A description of how you plan to achieve the required items…will you use Res Manager Pro or other tools.

4) Time to complete.

Login Credentials / Admin User:
Username: user
Password: user

Post Prom Article Seo Links.

Post Prom Article Seo Links.
I would like 5 links with a small paragraph posted daily(each paragragh is to be different)on highly related sites. The day before posting I would like to see the paragraphs (including the links) and where the paragraph is to be posted so I can pass them.

These paragraphs could be posted on related forums, related blog comments, related yahoo answers, other related question and answer sites.

UNDER NO CIRCUMSTANCES ARE ANY POSTS TO BE MADE BEFORE I HAVE PASSED THEM.

YOU MUST BE A GOOD WRITER WITH AN UNDERSTANDING OF PROM

The theme is prom dresses, the anchor texts will be released at start of project.

Please bid for 5 days worth of posting – in total 25 links. Also when you bid can you provide me with an example of where you would post these links.

Niche Articles Needed

Niche Articles Needed
I need someone to write me (5) 400 word articles at a reasonable price.

They need to be about my specific niche.
I need them to be 100% original and unique.
I will supply the specific keywords and broad topics. I really need creative person that can also add good titles….for example :
“5 reasons why….”

Please provide a sample of your work.
Must be good English.
Must pass CopyScape.
Must pass Ezine Article submission criteria.

Note:
If you are interested, I will give you the niche and example keywords upon request.

Make List From Data On Website

Make List From Data On Website
We need someone to put a list together by just copying the name and email from a website and putting it into excel or some other document.

Basically the website has the names of all professionals in an industry and we need someone who can click on each name, hit the third tab to show their email, and copy the name and email to a list.

Some do not have emails listed so can put N/A next to their name. There are a few thousand total (when including people with and without emails). We would like the option of being able to sort so that people without emails are either not listed or listed on bottom. The people with emails are all that matter.

We need someone to start asap and who can get this done quickly.

Transcription 50 Hours

Transcription 50 Hours
I am looking for someone or a group of people to transcribe 50 hours of audio interviews in English.

Here are the bidding criteria:
Must provide a 1-2 minute transcription of the sample file (at the quality level you will deliver to me)
Must specify the points where the speaker in the file changes as you will need to be able to do this during the transcription.
Winning bidder will be selected based on quality of there transcription and price.

Creative Article Rewriting

Creative Article Rewriting
I am looking for a creative writer(s) to re-write 100 articles in “male enhancement” niche. It would be nice to find a long term writer.

Of course, I will provide you with articles. Each of them will be optimized for one keyword.

The word count of rewritten articles will be about 425 ( not including the title ). The articles will be submitted to the Ezine so they must be original and error free… their editors are very sensitive about both of these issues.

I would imagine that it is relatively easy project for a someone with a bit of creative mind but an excellent proficiency in English is an absolute must to qualify for this project.

Please be realistic about your writing skills… I am tired of dealing with “struggling” writers.

The articles must be well written and interesting to read. I will not tolerate any “fluff”.

The rate is $2.00 per article. Please bid only if this rate is O.K. with you and if you can provide at least 5 quality articles per day ( about 20 ~ 30 articles weekly ).

The SAMPLE ARTICLE is below. If you have any questions… please ask.

Thank you.
Andre

Making Your Penis Bigger – The Truth About Male Enhancement and How to Supercharge Your Penis Size!

Do you want to have that rock hard, long and thick penis that will make your woman swoon just by seeing you? This is easier to attain than you think it is. You may not be aware of this, but doing the right exercises and having the right diet are proven to make your penis longer as well as thicker, and this does do not require the purchase of any gadgets or the use of any drugs.

Exercise and diet go hand in hand in enlarging your penis

Indeed, natural exercises such as jelqing and contraction techniques will provide the necessary motions and pressure to help enlarge the soft tissue chambers in your penis that define your size. Exercise will increase the amount of blood flowing into the extremities and encourage a growth of these tissues. Besides, a good diet can do wonders to the size of your male anatomy. You see, foods that contain anti-oxidants (such as chocolates and dark berries) will help expand the penile blood vessels in diameter and also facilitate more efficient flow of blood to your penis.

What about taking herbal enhancement pills?

I would not advise you to go down the route of consuming pills. There have been many men who had been ripped off or scammed by the promises made by dubious pill manufacturers. The truth is, many pill products do not perform up to the mark where safety is concerned. When put under microscopic tests, many pills – including those supposed to contain natural herbal ingredients – reveal the presence of toxic ingredients or substances that have not passed the scrutiny of the FDA.

What about the use of penis enlargement pumps?

A penis pump works to increase blood flow to your member. The problem with this is that you cannot have control over the blood flow or how you wish to increase it. Due to the kind of pressure exerted on your penis, there is a great potential – as many unfortunate men can tell you – of permanently damaging the delicate tissues in your penis from prolonged usage of such devices. And you too have to bear the embarrassment of having these gadgets lying around at home!

So for guys who want to grow a decent penis size that stays with you for life, here’s my advice: Just work out and focus on your diet. Yes, it does take time. But if you stick with it, you can achieve a size that will make women go weak in their knees!