What is the proper way to send data through http using sim908?
You mention two different error messages.

1. AT+HTTPINIT fail

You get +CME ERROR 3. Which means "operation not allowed".

This can be due to an improperly closed HTTP setup.
If you get this error (or just always do before setting up), call AT+HTTPTERM to be sure that it's closed.

2. AT+HTTPACTION=1

I notice you're trying to do a POSTmessage, while your variables are in the URL (which is GET style afaik).

I've found a source that states you need to call AT+HTTPDATA with apropriate values.


  Tell the module that you will be sending 192 bytes of data and it can timeout after 10 seconds of inactivity. 


After that, the device will say DOWNLOAD, and you can send the POST body.


  After this command you get the DOWNLOAD URC then you can type in 192 bytes of data within 10 seconds. The typed data is filled in a local buffer of the module and is not yet posted to the server. In the post body is the multi part form data which contains the necessary headers and data to post a file with name data.txt with 10 bytes of data.
  AT+HTTPDATA=192,10000


And after that you can send the POST message.


  Execute the HTTP POST command so that the buffer contents are POST to
  the server AT+HTTPACTION=1 OK


You will get a return message that states the HTTP code (200 'OK') and the amount of bytes received in the return message.


  +HTTPACTION:1,200,141
  This URC means that the data was successfully posted to the server and received 141 bytes of data.
  which is the server response to your HTTP POST


You can use AT+HTTPREAD to receive these bytes.


  The below command tells the module that we want to read the received data AT+HTTPREAD The below is the data
  received from the server
  +HTTPREAD:141 Successfully dumped 0 post variables. View it at http://www.posttestserver.com/data/2015/10/07/07.41.291690063480 Post
  body was 0 chars long. OK


(Scroll a fair bit down in the source, the first part is on HTTP GET: http://www.raviyp.com/embedded/194-sim900-gprs-http-at-commands)

You could also omit this by using HTTP GET since it's somewhat easier.

If all else fails, you can set up a TCP IP connection with the GSM module and manually set up the HTTP GET/POST message.