FSharp.Data 程序集之 Http

(**

# F# Data: HTTP Utilities

.NET 库提供了强大的 API,产生和发送 HTTP WEB 请求,有两个类型,一个简单,`WebClient`(参见 [MSDN][1]) ,另一个稍微复杂,`HttpWebRequest`,(参见 [MSDN][2]) 。然而,这两个类型的使用相当困难,如果只打算运行简单的 HTTP 请求,指定参数,比如,方法、HTTP POST 数据或者额外的头。

F# Data 库提供简单的 Http 类型,有两个重载的方法:`Request` and `AsyncRequest`,用于创建同步、异步执行的请求。

[1]: http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx

 [2]: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

要使用这个类,首先要引用库,F# interactive 中使用 `#r`,在项目中添加引用,然后加载 `FSharp.Net` namespace:

*)

Credentials <- NetworkCredential ("hadstj@hotmail.com","kokyWfYXaG5H63g3CvS3UW5mgnydQFvwXyc1h+p7U+I=")

#r "../../bin/FSharp.Data.dll"

open FSharp.Net

(**

##   发送简单的请求

在发送简单的 HTTP (GET) 请求,下载指定的页面,可以使用 `Http.Request` and `Http.AsyncRequest`,只需要一个参数:

*)

// 下载页面

Http.Request("http://tomasp.net")

// 异步下载页面

async { let! html = Http.AsyncRequest("http://tomasp.net")

        printfn "%d" html.Length }

|> Async.Start

(**

在下面的文档中,我们只讨论 `Request` 方法,因为 `AsyncRequest` 的用法完全相同:

## 查询参数与头

指定查询参数的方法,可以是把参数包含在 URL 中 (例如 `http://...?test=foo&more=bar`),也可以使用可靠的参数 `query` 进行传递。下面的例子,还显式指定了 GET 方法,如果不指定,会自动设置:

*)

Http.Request("http://httpbin.org/get", query=["test", "foo"], meth="GET")

(**

指定额外的头也很相似,使用可选的参数 `headers`。这个集合不仅可以包含标准的头,比如 Accept 头(当使用 `HttpWebRequest` 时,必须显式指定),还可以包含自定义的头。

下面的例子使用 [电影数据库] (http://www.themoviedb.org) API,搜索 "batman"。要运行这个例子,需要注册,并提供 API 的 key:

这里提供了一个 key,是 F# 大拿演示用的。请仅用于测试程序。

*)

// API key for http://www.themoviedb.org

let apiKey = "6ce0ef5b176501f8c07c634dfa933cff"

// HTTP 请求

Http.Request

  ( "http://api.themoviedb.org/3/search/movie",

    query   = [ "api_key", apiKey; "query", "batman" ],

    headers = [ "accept", "application/json" ])

(**

## 发送请求数据

如果打算发送有 HTTP POST 数据的 POST 请求,可以使用 `body` 参数,以字符串形式指定额外的数据,也可以在 `bodyValues` 参数中以键-值对的形式指定数据。如果指定 body 数据,不需要指定 `meth` 参数,自动设置成 `GET` 方法。

下面的例子使用 [httpbin.org](http://httpbin.org) 服务,它会返回请求的详细信息:

*)

Http.Request("http://httpbin.org/post", bodyValues=["test", "foo"])

(**

通常,Content-Type 头被设置为 `application/x-www-form-urlencoded`,但是,也可以改变,只要使用可选的 `headers`参数,在头列表中添加 `content-type`:

*)

Http.Request

  ( "http://httpbin.org/post",

    headers = ["content-type", "application/json"],

    body = """ {"test": 42} """)

(**

## 在请求之间保持 cookies

如果想在请求之间保持 cookies,可以指定 `cookieContainer` 参数。

下面的例子是检索 MSDN 文档中有关 `HttpRequest` 类,只包含 C# 的代码片段,而没有 F# 的:

*)

// 为给定类的文档构建 URL

let msdnUrl className =

  let root = "http://msdn.microsoft.com"

  sprintf "%s/en-gb/library/%s.aspx" root className

// 得到页面,查找 F# 代码

let docInCSharp = Http.Request(msdnUrl "system.web.httprequest")

docInCSharp.Contains "<a>F#</a>"

(**

如果我们现在到另外的 MSDN 页面,在 F# 代码示例上单击,然后,返回 `HttpRequest` 类文档,它会保持相同的 `cookieContainer`,会得到 F# 的代码片段:

*)

open System.Net

let cc = CookieContainer()

// 发送请求,并切换语言

Http.Request

  ( msdnUrl "system.datetime",

    query = ["cs-save-lang", "1"; "cs-lang","fsharp"],

    cookieContainer = cc) |> ignore

// 再次请求文档,并查找 F#

let docInFSharp =

  Http.Request

    ( msdnUrl "system.web.httprequest",

      cookieContainer = cc )

docInFSharp.Contains "<a>F#</a>"

(**

如果想看到更多有关这个的信息,包括响应的头,返回的 cookie,以及响应的 URL(如果有重定向的话,它会不同于传递进去的 URL),可以使用 `RequestDetailed` 方法:

*)

let response = Http.RequestDetailed(msdnUrl "system.web.httprequest")

// 检查响应的信息

response.Cookies

response.ResponseUrl

(**

## 请求二进制数据

`Request` 方法总是把响应返回成字符串,但是,如果使用 `RequestDetailed` 方法,可以根据响应的 `content-type` 头属性,返回 `HttpResponseBody.Text` 或 `HttpResponseBody.Binary`:

*)

let logoUrl = "https://raw.github.com/fsharp/FSharp.Data/master/misc/logo.png"

match Http.RequestDetailed(logoUrl).Body with

| HttpResponseBody.Text text ->

    printfn "Got text content: %s" text

| HttpResponseBody.Binary bytes ->

    printfn "Got %d bytes of binary content" bytes.Length

(**

## 发送客户端证书

如果想在请求中加上客户端证书,可以使用可选的参数 `certificate`,然后传递 `X509ClientCertificate` 值。这需要引入 `System.Security.Cryptography` 中的 `X509Certificates` 命名空间。

假设证书保存在  `myCertificate.pfx`,程序可以这样写:

*)

open System.Security.Cryptography.X509Certificates

// 从文件加载证书

let clientCert =

  new X509Certificate2(".\myCertificate.pfx", "password")

// 发送带证书的请求

Http.Request

  ( "http://yourprotectedresouce.com/data",

    certificate = clientCert)

FSharp.Data 程序集之 Http的更多相关文章

  1. 未能加载文件或程序集"System.Data,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"或它的某一个依赖项。系统找不到指定的文件。

    sqlserver 2005打开出现无法正常访问数据,提示信息: 未能加载文件或程序集"System.Data,Version=2.0.0.0,Culture=neutral,PublicK ...

  2. 《powershell 的版本号所引起的载入 FSharp 编译器问题》基本解决

    <powershell 的版本号所引起的载入 FSharp 编译器问题>基本解决 1.FSharp.Core.dll.不光要 Add-Type,还要在编译中引用.可是,在 VS2012 的 ...

  3. 【C#】解析C#程序集的加载和反射

    目录结构: contents structure [+] 程序集 程序集的加载 发现程序集中的类型 反射对类型成员的常规操作 发现类型的成员 创建类型的实例 绑定句柄减少进程的内存消耗 解析自定义特性 ...

  4. 编译 Deedle

    编译 Deedle Deedle 中含有 RProvider. 要编译 Deedle.须要先下载 R.地址: http://cran.cnr.berkeley.edu/bin/windows/base ...

  5. [转]查询表达式 (F#)

    本文转自:http://msdn.microsoft.com/zh-cn/library/hh225374.aspx 查询表达式可以查询数据源并将数据是一种预期形式.             查询表达 ...

  6. 一系列令人敬畏的.NET核心库,工具,框架和软件

    内容 一般 框架,库和工具 API 应用框架 应用模板 身份验证和授权 Blockchain 博特 构建自动化 捆绑和缩小 高速缓存 CMS 代码分析和指标 压缩 编译器,管道工和语言 加密 数据库 ...

  7. Github上优秀的.NET Core项目

    Github上优秀的.NET Core开源项目的集合.内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:htt ...

  8. 【转载】Github上优秀的.NET Core项目

    Github上优秀的.NET Core项目 Github上优秀的.NET Core开源项目的集合.内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志. ...

  9. Github上优秀的.NET Core开源项目的集合

    内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:https://github.com/jasonhua95/ ...

随机推荐

  1. VB几种函数参数传递方法,Variant,数组,Optional,ParamArray

    VB几种函数参数传递方法,Variant,数组,Optional,ParamArray 一) 过程的参数被缺省为具有 Variant 数据类型. 1)ByRef按 地址传递参数在 VB 中是缺省的 按 ...

  2. Modernizr——为HTML5和CSS3而生!

    原文地址:http://www.alistapart.com/articles/taking-advantage-of-html5-and-css3-with-modernizr/ 堂主译文地址:ht ...

  3. SQL 插入查询的最大ID 号 进行批量

    INSERT INTO tbl_image_language ( code, docomo_cd, au_cd, softbank_cd ) SELECT DISTINCT((SELECT max(c ...

  4. 关于图表的JS插件

    http://echarts.baidu.com/ http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6% ...

  5. 用XMPP实现完整Android聊天项目

    简介 这是一个完整的xmpp的Android的项目服务端使用openfire3.9.3客户端使用Android4.2.2 集成第三方:百度地图sdkasmack.jaruniversal-image- ...

  6. C++ nullptr 的一种实现

    C/C++ 程序员都应该了解NULL, 0, nullptr,  NULL表示空指针,即指针不指向任何对象,C++11后有多了nullptr更好是表了这类概念,看看nullptr是如何实现的: con ...

  7. nodejs新手教程中upload file的问题

    可参见: http://cnodejs.org/topic/50234890f767cc9a51f88481 request.setEncoding("utf8");应注释掉.

  8. JQuery中$.ajax()方法参数

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  9. 实验二:基于mykernel实现的时间片轮转调度

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

  10. spring mvc标准项目结构

    src com.xxx.inews.dao com.xxx.inews.dao.impl com.xxx.inews.data.entity com.xxx.inews.data.vo com.xxx ...