简体   繁体   中英

Passing string list to F# asp.Net api

I actually solved my problem before posting, but I wonder if there are any better solutions? Also if there is somewhere where there is a way to use list as-is?


I am writing a simple get endpoint if F# which needs to accept a list of strings as an argument.

I take that list as the input to a query that runs as expected, I am not worried about that part.

The problem I am facing is as follows (minimal implmenetation):

When I define the endpoint as:

    
[<HttpGet>]
member _.Get() =
  processStrings [ "test"; "test2" ]

it returns as expected.

When I change it to:

[<HttpGet>]
member _.Get([<FromQuery>] stringList: string list) = processStrings stringList

I get an error:

InvalidOperationException: Could not create an instance of type 'Microsoft.FSharp.Collections.FSharpList`1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Record types must have a single primary constructor. Alternatively, give the 'stringList' parameter a non-null default value.

Which doesn't make much sense to me, as I am using a list of strings, which in C# at least defaults to an empty list.

So I assume this comes down to how C# and F# interpret these signatures, but I am not sure how to resolve it.

I tried this signature and received the same error as above....

member _.Get( [<Optional; DefaultParameterValue([||]); FromQuery>] stringList: string list) = processStrings stringList

In the end using the following did solve the problem.

member _.Get( [<Optional; DefaultParameterValue([||]); FromQuery>] stringList: string seq) = processStrings stringList

I assume it was solved because seq is just IEnumerable, and then presumable list isn't just List from C# (mutable vs immutable). But is there a way to use an F# list in [FromQuery] parameters? Would [FromBody] have just worked? (No is the tested answer) Is there a way to add a type provider for an endpoint like this?

Is there something else I am missing here? Mine works now, but I am curious to the implications of the above.

I have not tested this, but I would assume that ASP.NET does not support F# lists as arguments. I would guess that taking the argument as an array would be much more likely to work:

[<HttpGet>]
member _.Get([<FromQuery>] stringList: string[]) = 
  processStrings (List.ofArray stringList)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM