小编Dev*_*r11的帖子

使用异步操作的铁路导向编程

以前问了类似的问题,但不知怎的,我没有找到出路,再次尝试另一个例子.

可以在https://ideone.com/zkQcIU上找到代码作为起点(稍微修整一下).

(它有一些问题识别Microsoft.FSharp.Core.Result类型,不知道为什么)

基本上所有操作都必须通过前一个函数进行流水线操作,将结果输送到下一个操作.操作必须是异步的,如果发生异常,它们应该向调用者返回错误.

要求是给调用者结果或错误.所有函数返回填充任何一个元组的成功 type Article失败type Error其描述对象code,并message从服务器返回.

我将在一个答案中欣赏我的代码中的被调用者和调用者的工作示例.

被叫代码

type Article = {
    name: string
}

type Error = {
    code: string
    message: string
}

let create (article: Article) : Result<Article, Error> =  
    let request = WebRequest.Create("http://example.com") :?> HttpWebRequest
    request.Method <- "GET"
    try
        use response = request.GetResponse() :?> HttpWebResponse
        use reader = new StreamReader(response.GetResponseStream())
        use memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(reader.ReadToEnd())) 
        Ok ((new DataContractJsonSerializer(typeof<Article>)).ReadObject(memoryStream) :?> Article)
    with …
Run Code Online (Sandbox Code Playgroud)

error-handling f# asynchronous function-composition

7
推荐指数
1
解决办法
511
查看次数

字符串不兼容

不确定我是否在这里遗漏了一些东西,当我尝试打印网址时它会抛出错误。

错误字符串与 Printf.TextWriteFormat 不兼容

type Credentials = {clientId: string; clientSecret: string}

let credentials = {clientId = ""; clientSecret = ""; deviceId = ""; deviceToken = ""}
let host = "https://example.com?grant_type=token";
let url = String.Format("%s?&client_id=%s&client_secret=%s", host, credentials.clientId, credentials.clientSecret)

printf url

let request = WebRequest.Create(url)
Run Code Online (Sandbox Code Playgroud)

编辑请求标头接受不起作用

    let request = WebRequest.Create(url)
    request.Method <- "POST"
    request.ContentType <- "application/x-www-form-urlencoded"
    //request.Headers.Set "Accept" "application/json;charset=UTF-8"
    request.ContentLength <- (int64)data.Length


request.Accept <- "application/json;charset=UTF-8" // doesnt' work either
Run Code Online (Sandbox Code Playgroud)

printf f#

5
推荐指数
1
解决办法
865
查看次数

等待邮箱处理器

是否可以等待邮箱处理器,以下代码在 F# 交互式中工作,但有没有办法在应用程序或单元测试中等待它?

[<TestMethod>]
member this.TestMailboxProcessor() =
    let mailboxProcessor = MailboxProcessor<string>.Start(fun inbox ->
        async {
            while true do
            let! msg = inbox.Receive()
            printfn "agent got message %s" msg // too late, UnitTest exits
        }
    )

    mailboxProcessor.Post "ping"
    Console.WriteLine "message posted" // I see this in the console
    Assert.IsTrue(true)
Run Code Online (Sandbox Code Playgroud)

f# mailboxprocessor

5
推荐指数
2
解决办法
604
查看次数

如何为 Web 请求指定标头

尝试为 http 调用设置标头但遇到问题。需要指导Authorization和自定义标题x-api-key

let url = "http://example.com"
let token = requestToken()

let request = WebRequest.Create(url) :?> HttpWebRequest
request.Method <- "GET"
request.Accept <- "application/json;charset=UTF-8"
request.Headers.Authorization <- sprintf "%s %s" token.token_type token.access_token
request.Headers["x-api-key"] <- "api-key" // custom headers

// or this

request.Headers["Authorization"] <- sprintf "%s %s" token.token_type token.access_token
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

错误 FS3217:此表达式不是函数,无法应用。您是否打算改为访问 indexervia expr.[index] ?

f# http-get request-headers http-headers

3
推荐指数
1
解决办法
543
查看次数

使用默认值选择值

在回答这个问题的帮助下,我需要帮助解决在以下情况下如何从选项类型中检索值的具体语法.

type Query = {
    q : string
    pageSize : int option
}

let search (query : Query) =
    let url = sprintf "foo.com?q=%spageSize=%i" query.q (query.pageSize |> 10 |< query.pageSize) // ???
Run Code Online (Sandbox Code Playgroud)

语法帮助 (query.pageSize |> 10 |< query.pageSize)

f# option-type

3
推荐指数
1
解决办法
1581
查看次数

尝试使用资源 - 参数化的 PreparedStatements

编辑建议的答案是不可接受的,不能为我拥有的每个方法声明其他方法,想象一下?。必须使用资源解决方案进行嵌套尝试。

如何在带参数的准备语句中使用 try 语句?

我有以下两行错误。

preparedStatement.setString(1, uuid);
preparedStatement.setString(2, emailAddress);
Run Code Online (Sandbox Code Playgroud)

错误声明 final 或有效的 final 变量

public UserBean getUserDevices(final String emailAddress, final String uuid) throws SQLException {
    UserBean userBean = null;

    String query = "SELECT user.id, user.emailAddress, device.uuid, device.active, device.user_id FROM user " +
            "LEFT JOIN device ON user.id = device.user_id AND device.uuid = ? " +
            "WHERE user.emailAddress = ?";

    try (Connection connection = dataSource.getConnection();
         PreparedStatement preparedStatement = connection.prepareStatement(query);
         preparedStatement.setString(1, uuid);
         preparedStatement.setString(2, emailAddress);
         ResultSet resultSet = preparedStatement.executeQuery();

    ) {
        while(resultSet.next()) …
Run Code Online (Sandbox Code Playgroud)

java prepared-statement

0
推荐指数
1
解决办法
3550
查看次数