[HN Gopher] Show HN: WebFrame: F# framework for rapid prototypin...
       ___________________________________________________________________
        
       Show HN: WebFrame: F# framework for rapid prototyping with ASP.NET
       Core
        
       Author : RussBaz
       Score  : 122 points
       Date   : 2021-11-05 16:36 UTC (6 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | rastreus wrote:
       | Wrapping ASP.NET Core to be easier and more idiomatic with F#
       | seems to be a common domain. Out of curiosity, did you look at
       | any existing projects? If so, what was lacking from them that
       | made you decide to write WebFrame?
       | 
       | Giraffe: https://github.com/giraffe-fsharp/Giraffe Saturn:
       | https://github.com/SaturnFramework/Saturn Falco:
       | https://github.com/pimbrouwers/Falco Wiz:
       | https://github.com/samueleaton/wiz
        
       | jmnicolas wrote:
       | Were you aware of https://minimal-apis.github.io/ before starting
       | this project?
        
       | FpUser wrote:
       | >"Don't get me wrong, it is insanely powerful, performant and
       | customisable web framework. And it is also one of the most USER-
       | UNFRIENDLY things I have ever encountered"
       | 
       | That is a Microsoft's trademark. They produce powerful and very
       | complex APIs. Historically for native apps it was Borland / now
       | Embarcadero would wrap those in still powerful but very user
       | friendly libs / components for Delphi. Not sure what is available
       | for .NET as I am not using the framework.
        
       | waynesonfire wrote:
       | I can do a web server in one line of code,
       | 
       | sudo service apache2 start
        
         | stickyricky wrote:
         | You forgot to define the hello-world endpoint.
        
         | de_keyboard wrote:
         | Totally missing the point. A good web framework lets you get
         | running with a few lines but then allows you to add custom
         | logic with minimal incidental complexity.
        
           | waynesonfire wrote:
           | I think you're missing the point. It's not how many lines of
           | code it takes. You have to think a bit harder what the
           | desirable properties are. Minimizing complexity is nice,
           | great start. What does that mean? It's certainly not one of
           | the "guiding principles" of this library. It's focusing on,
           | among other things,
           | 
           | - "least amount of code" - and "a beautiful code"
           | 
           |  _shrug_
           | 
           | You minimize complexity by defining primitive expressions,
           | means of combination, and means of abstraction [1]. Sound
           | familiar?
           | 
           | [1] https://mitpress.mit.edu/sites/default/files/sicp/full-
           | text/...
        
       | RussBaz wrote:
       | I was frustrated with the verbosity of ASP.NET Core, especially
       | as an F# user. Don't get me wrong, it is insanely powerful,
       | performant and customisable web framework. And it is also one of
       | the most USER-UNFRIENDLY things I have ever encountered in the
       | web development.
       | 
       | Therefore, I decided to wrap it in some helper functions to make
       | it as pleasant to work with for the new F# web developers as
       | possible. And ... I've got somewhat carried away. This is the
       | true origin of this project.
       | 
       | Before F# I was primarily into the Python, and I had really good
       | experience with Django. I wanted to make my helper look more like
       | Django but more I wrote, more it resembled Flask instead.
       | 
       | I have recently open sourced it under the MIT license on GitHub.
       | I hope this will help with making other web developers more
       | interested in seemingly niche language of F#.
       | 
       | I use it for a side project (some SPA app) I work on over the
       | weekends. Therefore, I frequently change and update it as I
       | encounter more missing things or parts that do not please me.
       | 
       | So, all the feedback is welcome! I am especially interested if
       | you find the framework API intuitive enough for non-F# folks.
       | 
       | Thanks for your time!
        
       | 0xcoffee wrote:
       | Are you aware of the work they did in C# to cut this down?
       | 
       | https://dotnetthoughts.net/minimal-api-in-aspnet-core-mvc6/
        
         | RussBaz wrote:
         | I do and I love this. It is clearly a positive change. However,
         | it is mostly for C# developers. Using the new API in F# is
         | still somewhat clunky. IMO
        
         | pharmakom wrote:
         | Still heavily object orientated, but a step in the right
         | direction.
        
       | kokanee wrote:
       | Someone will post the JS version, might as well be me
       | require('http').createServer((req, res) => res.end('Hello
       | World')).listen(8000)
        
         | metaltyphoon wrote:
         | I mean... that's kinda useless no?
         | 
         | C# version.
         | 
         | var app = WebApplication.Create(args); app.MapGet("/",() =>
         | "Hello World"); app.Run();
        
       | ASalazarMX wrote:
       | Great, now I can finally ditch                   python -m
       | http.server 8000
        
         | 0xFFFE wrote:
         | Exactly, I am pretty sure there is an equivalent in all the
         | major languages except C/C++.
         | 
         | go http.ListenAndServe(":8000", nil)
        
       | pbiggar wrote:
       | This is really nice. For comparison, this is what using ASP.NET
       | directly in F# is like:
       | 
       | https://github.com/darklang/dark/blob/main/fsharp-backend/sr...
        
         | pharmakom wrote:
         | Any thoughts on Giraffe vs Saturn vs Suave?
        
           | pbiggar wrote:
           | I tried them all, didn't like any of them.
           | 
           | As I recall, Suave is on its way out, and was replaced by
           | Saturn. Saturn is built on Giraffe.
           | 
           | I found Saturn to be incredibly confusing because you need to
           | understand both it and Giraffe to be able to use it.
           | 
           | I used Giraffe for a while, but I still needed to understand
           | the ASP.NET middleware approach, which didn't match
           | Giraffe's.
           | 
           | Also, ASP.NET has a new endpoint based routing framework
           | which is supposed to be very fast. Giraffe has started to
           | adopt that, but I found most of the docs refer to the old way
           | of doing things. So although I'm using it a little bit in the
           | code above, I found it easier to just use ASP.NET directly in
           | most cases.
        
       | BiteCode_dev wrote:
       | Since F# is typed, have a look at FastApi in Python. It's a
       | better inspiration than flask: it uses dep injection with typing
       | to configure your endpoints. It's very flexible, infinity
       | composable, and such a nice experience.
       | 
       | Django's API is now clearly dated. I still use it massively
       | though, because it's insanely productive for CRUD apps, which are
       | 99% of my client requests.
       | 
       | They made some hard choices about the auth and db layer, and they
       | are imperfect, but when left to do the choice myself in other
       | frameworks, I often miss Django. You really value all it gives
       | you once you've lost it.
        
         | submeta wrote:
         | Thank you for mentioning FastAPI. Looks awesome. Recently I
         | started using Flask, as Django feels like too much overhead for
         | smaller projects. FastAPI looks like a good alternative to
         | Flask.
        
           | BiteCode_dev wrote:
           | > Django feels like too much overhead for smaller projects
           | 
           | It depends. My advice is always: stick to django no matter
           | what, unless you are a seasoned web devs. I've seen too many
           | flask projects with terrible architecture decisions and
           | security holes because flask assumes (by nature) you can take
           | those decisions.
           | 
           | Those decisions are not easy to take. They require a deep
           | knowledge of the field.
           | 
           | So yes, one may chose flask or fast api as a lighter
           | alternative, provided they know very well what they are
           | doing, or that the consequences of not knowing are small. The
           | later is not always simple to evaluate however, especially if
           | you are not experienced. You don't know what you don't know
           | after all.
           | 
           | If somebody doesn't know if they are an experienced web dev,
           | or the consequences of their choices, they should use Django.
           | 
           | It will save them from SQL injection, XSS, Cross request
           | forgery and click hijacking. It will provide an pluggable
           | auth backend should you need it later. It will force you to
           | put some parts of your code in separate sillows. This is a
           | good thing for most people.
        
             | spinningslate wrote:
             | agree it depends, and I haven't looked at Django for years
             | - so can't comment on it.
             | 
             | However, I have been using FastAPI with Jinja2 & htmx to
             | create web APIs and UIs for some of our services.
             | Individually, they're great; collectively they're a joy.
             | I'm no front end dev, but even I can put together
             | functional, decent-looking apps in a few hundred lines of
             | code. They bare comparison to angular apps that can easily
             | be an order of magnitude more code.
        
             | loulouxiv wrote:
             | Frankly if you go with the most popular extensions: Flask-
             | SQLAlchemy, Flask-Login and Flask-Admin you will have more
             | or less all the features of Django with a nicer API, better
             | documentation and more flexibility
        
         | RussBaz wrote:
         | I just wanted to mention that I considered FastApi but the
         | amount of reflection and magic required to go this route was a
         | bit too much to my liking in F#. Just a personal preference.
         | 
         | I mostly agree with you on Django though. But as you said -
         | most apps are CRUD apps.
        
       | platz wrote:
       | how would you do something like validating JWTs, such as issuer
       | claims, with this framework?
        
       | JaggerJo wrote:
       | Can recommend Giraffe for building APIs.
        
       | devmunchies wrote:
       | > Every time I tried to write something quickly, I often had to
       | choose between a heavily functional programming oriented
       | frameworks or extremely tedious ASP.NET Core.
       | 
       | Agree. dev experience is missing in dotnet IMO. I had the exact
       | same sentiment last year. made https://wiz.run/
       | 
       | I hated going through all the microsoft dotnet docs. Wanted
       | something like this: https://wiz.run/api/
        
       | d3nj4l wrote:
       | You don't have to use asp.net directly in F# - there's been a
       | long-standing library wrapping it in a more functional aesthetic
       | with Giraffe: https://github.com/giraffe-fsharp/Giraffe
       | 
       | Not to discourage you or anything - always good to see
       | alternatives. Personally, for FP web programming, the closer to
       | the "your server as a function" ideal the better - so I'd prefer
       | Giraffe in this case, for things like the router being an
       | HttpHandler instead of being a property on the app instance. It's
       | just way more intuitive from an FP standpoint and produces
       | neater, more self-contained code, IMO.
        
       | a_lost_needle wrote:
       | This is fantastic. I prototype, and the last thing I want to do
       | is set up and deal with all the nonsense when I need only usually
       | need a few calls to a server to prove out the concept.
       | 
       | Love it.
        
         | RussBaz wrote:
         | Thanks a lot for such a positive response! Feel free to message
         | me if you have any issues.
        
       ___________________________________________________________________
       (page generated 2021-11-05 23:00 UTC)