以前问了类似的问题,但不知怎的,我没有找到出路,再次尝试另一个例子.
可以在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) 不确定我是否在这里遗漏了一些东西,当我尝试打印网址时它会抛出错误。
错误字符串与 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) 是否可以等待邮箱处理器,以下代码在 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) 尝试为 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] ?
在回答这个问题的帮助下,我需要帮助解决在以下情况下如何从选项类型中检索值的具体语法.
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)
编辑建议的答案是不可接受的,不能为我拥有的每个方法声明其他方法,想象一下?。必须使用资源解决方案进行嵌套尝试。
如何在带参数的准备语句中使用 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)