2014-06-18 4 views
0

У меня есть рабочий файл .php на удаленном сервере. Если я запускаю следующее:Как перевести эту команду curl на lua?

curl -F "USER=user" -F "PASS=pass" -F "TIME=12345" -F "[email protected]" http://myurl.com/create.php 

он вернется:

{"PASS":"pass","USER":"user"} 

Однако я пытаюсь использовать один и тот же код с новым интерфейсом, запрограммированного в Lua, и пока она связаться с сервером , он также возвращает «Недопустимый запрос». Я установил .php для возврата «Недействительный запрос», если правильные значения POST не установлены.

Я редактировал .php, чтобы вернуть то, что вход получил был, и это ответ:

{"PASS":null,"USER":null} 

Мой .php код, как правило, следующим образом:

if (isset($_POST["USER"]) && isset($_POST["PASS"]) && isset($_POST["TIME"]) && isset($_POST["EMAIL"])){ 
    [...]do stuff[...] 
}else{ 
    sendResponse('Invalid request'); 
} 

И код Lua:

require "socket.http" 

function curlCreate() 

    response= socket.http.request("http://myurl.com/create.php","USER=user", "PASS=pass", "TIME=12345", "[email protected]") 
    print(response) 

end 

Я считаю, что это, возможно, флаг -F-флаг, сбрасывающий передачу lua, но документ ation lua curl-ing немного редок и старых.

Заранее благодарим за любые предложения!

ОТВЕТ ОПИСАНИЕ: Первый рекомендуемый метод ...

response= socket.http.request("http://someurl.com", "USER=user&PASS=pass&TIME=12345&[email protected]") 

... действительно работают!

+0

Вы можете просто написать 'if (isset ($ _ POST [" USER "], $ _POST [" PASS "], $ _POST [" TIME "], $ _POST [" EMAIL "])) {' – hjpotter92

+0

Кроме того, запрос должен быть следующим: 'socket.http.request {url =" http://myurl.com/create.php?USER=user&PASS=pass&TIME=12345&[email protected] ", method = 'POST'} ' – hjpotter92

ответ

2

«Ваш request вызов в curlCreate находится в неправильном формате. Строка-аргумент форма request принимает один или два аргумента URL, то тело. В HTTP, один из способов прохождения всех различных настроек параметров, чтобы присоединиться к ним с «&», так что вы могли бы попробовать второй (тело) аргумент на вызов, как:.

"USER=user&PASS=pass&TIME=12345&[email protected]" 

Я подозреваю даже, что не может работать опция локона -F также устанавливает заголовок типа контента (в «многоголосный/form-data "), и многие веб-приложения ищут этот заголовок как часть проверки запроса - я не знаю, если это проблема с PHP. Чтобы установить заголовки, вам нужно передать аргумент на request, что является более сложным, потому что форма аргумента карты является более общим средством нижнего уровня. Что-то вроде этого:

local http = require "socket.http" 
local ltn12 = require "ltn12" 

function postForm(url, body) 
    local sink, responseData = ltn12.sink.table() 
    local responseCode, statusCode, headers, statusLine = http.request { 
     url = url, 
     method = "POST", 
     headers = { 
      ["Content-Type"] = "application/x-www-form-urlencoded", 
      ["Content-Length"] = #body -- this header might not be necessary 
     }, 
     source = ltn12.source.string(body), 
     sink = sink   
    } 
    return table.concat(responseData), responseCode, -- etc. 
end 

(Реализация request(url, body) должна выглядеть так же, как это.)

Обратите внимание, что в этом примере Content-Type не «многочастному/форм-данных»: см this question для объяснения.

Смежные вопросы