2016-12-01 4 views
1

Я пытаюсь использовать пакет cohttp OCaml для отправки запроса POST с использованием метода Client.post. Я рассмотрел пример в ocaml-cohttp/lib_test/test_net_lwt_client_and_server.ml, чтобы использовать этот метод, вот фрагмент кода из примера, который использует эту функцию.Использование метода OCaml cohttp Client.post

Client.post ~body:(Cohttp_lwt_body.of_string "barfoo") url

Я использую функцию точно таким же образом в моем собственном коде:

Client.post ~body:(Cohttp_lwt_body.of_string bodyString) (Uri.of_string stringURI) >>= function 
          | Some (_, body) -> Cohttp_lwt_body.string_of_body body 
          | None -> return "" 

Но я получаю сообщение об ошибке:

Error: This pattern matches values of type 'a option 
    but a pattern was expected which matches values of type 
    Cohttp.Response.t * Cohttp_lwt_body.t 

Я смотрел на https://github.com/mirage/ocaml-cohttp/issues/64 который предложил изменить метку ~body на ?body, но затем я получил другую ошибку:

Error: This expression has type Cohttp_lwt_body.t 
    but an expression was expected of type Cohttp_lwt_body.t option 

Не могли бы вы объяснить, как правильно использовать эту функцию?

ответ

2

сообщение об ошибке указывает на то, что это проблема, набрав:

Error: This pattern matches values of type 'a option 
    but a pattern was expected which matches values of type 
    Cohttp.Response.t * Cohttp_lwt_body.t 

Ваше function тело справа от привязки (>>=) следует переписать, чтобы обработать кортеж, возвращаемый Client.post, а не option типа. Например:

Client.post 
    ~body:(Cohttp_lwt_body.of_string bodyString) 
    (Uri.of_string stringURI) 
>>= fun (response, body) -> 
match response with 
| { Cohttp.Response.status = `OK; _ } -> ok_response_action body 
| { Cohttp.Response.status; _ } -> other_response_action status body 

cohttp, к сожалению, в настоящее время нет доступной документации. Вам нужно будет напрямую ссылаться на файлы .mli. Например, см. here для информации о структуре типа Cohttp.Response.t.