Search code examples
jsoncurlluacoronasdkdjango-piston

equivalent CURL for Lua, (Django API Json to Lua Json) POST method


I have a Django that having API for JSON, and I want it to get it in my Lua (Corona SDK) project.

if I CURL my Django project.

curl -l -X POST -d "message=getstrings" http://127.0.0.1:8000/api/getstrings/

this will return:

{
    "message": "Something good happened on the server!", 
    "data": [
        {
            "code": "003", 
            "doc1": "sd.doc", 
            "title": "Test", 
            "artist": "ABBA", 
            "img": "sd.png", 
            "genre": "Pop"
        }, 
        {
            "code": "004", 
            "doc1": "sdsd.doc", 
            "title": "sdf", 
            "artist": "ABBA", 
            "img": "sdsd.png", 
            "genre": "Pop"
        }
    ], 
    "success": true
}

i have a problem in post method for json in Lua. i want the returned json will be get in Lua.

i try this in my Lua.

local response = {}
local r, c, h = http.request{
  url= "http://127.0.0.1:8000/api/getstrings/",
  method = "POST",
  headers = {
    ["content-length"] = "",
    ["Content-Type"] = "application/x-www-form-urlencoded"
  },
  source = ltn12.source.string(post),
  sink = ltn12.sink.table(response)

}
local path = system.pathForFile("r.txt", system.DocumentsDirectory)
local file = io.open (path, "w")

file:write (response[1] .. "\n")
io.close (file)

when i open r.txt:

i got this ...

File "home/myhome/workspace/djangoproj/api/handlers.py", line 21, in create
  if attrs['message'] == 'getstrings':

KeyError: 'message'

i know what cause of the error because message and its value did not passed by Lua. my question is that what is the equivalent code like this CURL

curl -l -X POST -d "message=getstrings" http://127.0.0.1:8000/api/getstrings/

in Lua (Corona SDK) so that the Lua can get and download the returned Json? is my code in my Lua is correct?

do anyone have an idea about my case? thanks in advance ...


Solution

  • Why not use the network.request function provided by Corona?
    It is asynchronous as well.

    local function listener(event)
        print(event.response)
        print(event.isError)
        print(event.status)
    end
    
    
    local url = "http://127.0.0.1:8000/api/getstrings/"
    
    local body = "message=getstrings"
    
    local headers = {}
    headers["content-length"] = body:len(),
    headers["Content-Type"] = "application/x-www-form-urlencoded"
    
    
    
    local postData = {}
    postData.body = body
    postData.headers = headers
    
    network.request(url,"POST",listener,postData)
    

    Have a read here http://developer.anscamobile.com/reference/index/networkrequest

    EDIT

    If you REALLY want to use http.request then you can do this.

    local url = "http://127.0.0.1:8000/api/getstrings/"
    local body = "message=getstrings"
    local headers = {
        ["content-length"] = body:len(),
        ["Content-Type"] = "application/x-www-form-urlencoded"
      }
    
    local response = {}
    local r, c, h = http.request{
      url= url,
      method = "POST",
      headers = headers,
      source = ltn12.source.string(body),
      sink = ltn12.sink.table(response)
    
    }