2014-03-06 66 views
1

我正在使用Ocamlnet編寫一些Web服務。更具體地說,我將Netcgi_scgi與Apache 2結合使用。我可以使用Ocamlnet CGI讀取原始POST數據嗎?

它看起來像所有功能都是針對向我呈現用戶輸入的已解析視圖。

有沒有什麼辦法讓我直接訪問輸入流,以便我可以自己解析原始POST數據?

此外,有沒有辦法讓我防止Netcgi代碼自動嘗試解析POST數據? (我發現,我這樣做的方式,它會失敗,並且如果它沒有收到預期的鍵值格式會引發異常,所以我的處理程序甚至不會被調用。)

我理想地喜歡能夠支持JSON-RPC,它要求POST數據是一個沒有參數名稱的JSON對象。 (好了,這個規範並不是協議特定的,所以沒有詳細說明,但在我看來這是最合理的解釋。舊的(1.2)規範明確表明它是這樣做的。)

+0

的可能重複的[使用Ocamlnet 3正確的方法 - HTTP \ _client.Convenience.http \ _post](http://stackoverflow.com/questions/17047223/the-correct-way -use-ocamlnet-3-http-client-convenience-http-post) –

+0

@PaulSweatte:這個問題是關於使用HTTP客戶端發出POST請求。這與我所做的一切無關。我在服務器上解析請求,他在客戶端上編寫它們。他向Google發送他的請求,因此他的案例中的服務器甚至沒有寫入OCaml。 –

回答

0

簡單的方法是可以(用叢)允許application/json MIME

Nethttpd_plex.nethttpd_factory 
    ~config_cgi:Netcgi.({ 
    default_config with 
    default_exn_handler = false; 
    permitted_input_content_types = [ 
    "application/json"; 
    ] @ default_config.permitted_input_content_types}) 

然後你會得到的單參數BODY請求內容(如果客戶端正確發送Content-Type: application/json頭),所以你可以做這樣的事情

let get_json_request (cgi : Netcgi.cgi_activation) = 
    cgi # argument_value "BODY" 
    |> Yojson.Basic.from_string 

let generate_page (cgi : Netcgi.cgi_activation) = 
    get_json_request cgi |> process_json_request 

小更難(但是可能更好)的方法是提供自己的dyn_activationdyn_handler爲您處理程序或創建新的服務(尋找default_dynamic_service在ocamlnet源)...但我新去了這條道路......

+0

謝謝,這看起來像我需要的東西。雖然(這是一個老問題),但是我觸摸這個項目已經很長時間了,所以我不能馬上測試它。 –

0

使用cgi_argument

let with_arg arg f = Io.unwind ~protect:(fun arg -> arg#finalize()) f arg 

let get_arg cgi name = 
    try Some (with_arg (cgi#argument name) (fun arg -> arg#value)) 
    with Not_found -> None 

let parse ?default ~validate ~parse cgi name = 
    match default, get_arg cgi name with 
    | None , None -> argf "Missing parameter \"%s\"" name 
    | Some v, None -> v 
    | _  , Some p -> 
    try parse (Pcre.extract ~rex:validate ~full_match:false p) 
    with Not_found -> argf "Invalid parameter \"%s\"" name 

參考

+0

現在已經很長時間了,因爲我看過Netcgi,所以如果沒有測試我就不能確定(我還沒有時間);但這看起來不像是我解決問題的辦法。這看起來像我已經有的代碼,這是行不通的。感謝第二個鏈接,它看起來像一個有用的文章。 –

相關問題