FSharp.Data 程序集之 Http

摘要:
F#数据库提供了一个简单的Http类型和两个重载方法:“Request”和“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命名空间:*)凭据˂-NetworkCredential#r“../../bin/FSharp.Data.dll”openFSharp。Net//下载页面Http。请求//异步下载页面异步{let!以下示例使用[Movie Database]API搜索“batman”。*)//APIkeyforhttp://www.themoviedb.orgletapiKey=“6ce0ef5b176501f8c07c634dfa933cf”//HTTP请求HTTP。请求(**##发送请求数据如果要发送带有HTTP POST数据的POST请求,可以使用“body”参数以字符串的形式指定其他数据,也可以在“bodyValues”参数中以键值对的形式指定数据。


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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇KVC/KVO原理详解及编程指南Citrix 服务器虚拟化之十八 桌面虚拟化之部署MCS随机桌面池下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Web开发人员需知的Web缓存知识

最近的译文距今已有4年之久,原文有一定的更新。今天踩着前辈们的肩膀,再次把这篇文章翻译整理下。一来让自己对web缓存的理解更深刻些,二来让大家注意力稍稍转移下,不要整天HTML5, 面试题啊叨啊叨的~~ 什么是Web缓存,为什么要使用它? Web缓存游走于服务器和客户端之间。这个服务器可能是源服务器(资源所驻留的服务器Add),数量可能是1个或多个;...

Ajax之跨域请求

Ajax之跨域请求   一、引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径‘http://127.0.0.1:8000/index/’,对应的视图是index视图返回一个index页面,页面中只有一个button按钮,按钮绑定了一个单击事件,点击之后会发送一个ajax请求,请求的路径为‘htt...

关于http客户端常见错误"警告:Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is rec"

在开发过程中,经常得写http客户端测试接口服务,今天在使用过程中出现了这样的一个警告:警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.后来百度了一下,原来是客户端使用了getRes...

spring cloud 之 Feign 使用HTTP请求远程服务

一、Feign 简介 在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是,用起来最方便、...

【译】HTTP/2 为更快速的网站而生

最近在做一个内部的服务对接,使用了Google的gRPC框架,gRPC是基于HTTP/2和protocol buffers实现的,所以额外去了解了一下HTTP/2,找到这这边文章。这篇文章虽然是写于2015年时间比较久远,但是对于HTTP/2的介绍很全面,于是花了些时间翻译了一下。 原文地址:https://cascadingmedia.com/insit...

从输入 URL 到页面加载完的过程中都发生了什么事情?

1)把URL分割成几个部分:协议、网络地址、资源路径。其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号;协议是从该计算机获取资源的方式,常见的是HTTP、FTP,不同协议有不同的通讯内容格式;资源路径指示从服务器上获取哪一项资源。 例如:http://www.guokr.com/question/554991/ 协议部分:ht...