如何连接前端和后端?

How can I connect front-end with back-end?

我在一台笔记本电脑和一台服务器(后端)上使用 ASP.NET (visual studio) 创建了一个网页(前端)对于我在另一台笔记本电脑上的网页。首先,我有一个登录页面,我想从 textBox-es(前端)获取用户名和密码,然后以某种方式将数据传输到另一台笔记本电脑以验证它是否正确,然后接收数据是否正确正确与否。前端在Windows,服务器在Linux。我的队友在后端使用 python。

我在前端使用 HTML、CSS 和一点 C#,但我不知道如何将该用户名和密码传输给我的队友以及如何传输收到他的答复。 他的笔记本电脑上有数据库,他会验证该对是否正确并向我发送答案,他还想在 python 中编码。

我们认为我们可以在 ASP.NET 和 Node.js 之间做一些神奇的联系。

如何进行数据传输?

我是第一次做这个,所以请温柔点,因为我真的不知道该怎么做。

你的问题很宽泛,虽然我对网络应用程序不是很流利,但我会分享我能提供的建议。由于问题范围广泛,您无法得到准确、简短的答案。

关于您的问题的一些说明和反馈。

I have a web page (front-end) created with ASP.NET ...

您实际上在这里有一个 Web 应用程序(在您的情况下,它包括一个或多个网页)。多注意这些小细节,编程本身就是一种语法 natzy-ism 的形式,但它不是语法,你不是被人纠正的,而是被机器和生活纠正的。 Web应用程序的一个很好的定义:https://blog.stackpath.com/web-application/

We think that we can do some magic connection between ASP.NET and Node.js.

我不擅长网络应用程序,但在我看来,这条线完全出乎意料,您没有表示您正在或打算在后端使用 Node.js;您表示您使用的是 Python,因此我将忽略此声明。 哦,没有魔法,只有竞争条件。

从结构上讲,我会把这个问题分成几个小问题。以下是一些建议。

因为您正在尝试一项稍微复杂的任务,所以您无法逃避设计模式的想法(特别是因为使用了设计为模式友好的 ASP.NET)。

所以你的第一个问题应该类似于

如何与网络服务器通信asp.net

  • Two-way communication between ASP.NET Web App and C# Application
    • 后端不是 python 但阅读答案,它给你一个有效的指标,请求-响应模式可以帮助你
  • 搜索有关如何在 C# 中实现该模式的问题/ASP.NET

另一种可能的方法是

如何向服务器C#传输数据

从你的解释来看,我假设你已经实现了 UI 将检索输入数据的表单,所以我将跳过 UI 相关问题。

既然您希望通过互联网向用户发送敏感数据,那么您必须考虑安全问题。 更多问题

如何在数据库中安全地存储密码

  1. 这个问题实际上会引导您找到传输密码甚至接收内容的示例

我还有 2 个问题想讨论。

  1. 在互联网上搜索教程时,您可能会看到 很多在同一台机器上使用客户端和服务器应用程序。 这些对您来说仍然是有效的教程!阅读它们!我会解释 进一步说明为什么它(几乎)对你来说是一样的,即使你的情况是 远程服务器。

  2. 您需要能够以某种方式测试您的应用程序。

寻址 #1

为什么使用本地主机 (127.0.0.1) 对您来说与使用真实服务器(在您的情况下)相同。

假设你完成了应用程序,后台也做了,你想互相交流。你在互联网上读到你需要知道服务器的 IP,所以你要求你的伙伴让他提供他的 IP。您搜索了狂野的网络并得出结论,要找到您的 IP,您可以尝试:

  • 执行 ipconfig.exe(或根据您的平台使用什么工具)并获取 IPv4 Address. . . . . . . . . . . : 192.168.1.12 值。 您会假设这是您需要放入应用程序中进行连接的 IP。 这是错误的

  • 得出这样的结论是行不通的,您发现您可以通过 https://whatismyipaddress.com/ 等在线网站获取您的 IP 并将该 IP 用作您的服务器地址。 这(在 99% 的情况下)是错误的。

一点诗意

将 IP 视为您在世界范围内的地址,并将您的本地(私有)IP 视为您家中的确切位置。您看到的 IP 地址是一个本地 IP,它会指示您坐在哪把椅子上,比方说已经提供的示例中的 12。世界上任何人(反正有 12 把椅子)都可以坐在他们家里的第 12 把椅子上。您不能使用此信息来识别某人的地址。

你怎么知道那个IP是本地IP?

一种方法是查看 ipconfig.exe(或您正在使用的任何工具)的完整输出,您会在上面看到 Wireless LAN adapter Wi-Fi: 从您获得 IP 的地方, LAN (hxxps://en.wikipedia.org/wiki/Local_area_network) 是一个指标。

另一个(更直接)是通过识别 IP 范围(或视觉模式,如果 IP 范围对您来说还不是一个清晰的概念)。如果它以 198.168. 开头,那么它就是一个 local/private IP 地址。请在这里阅读更多:https://en.wikipedia.org/wiki/Private_network

IP 是一种有价值的商品(我不是在开玩笑)。随着世界的发展,您现在不能简单地用互联网电缆插入计算机,瞧,您拥有自己的 IP。几十年前互联网刚刚起步时,这是(相对)正确的,但现在 IP 由大(大)公司管理,他们按他们的考虑分配 IP。

The IP address space is managed globally by the Internet Assigned Numbers Authority (IANA), and by five regional Internet registries (RIRs) responsible in their designated territories for assignment to local Internet registries, such as Internet service providers, and other end users.

维基语录:https://en.wikipedia.org/wiki/IP_address

我也高度(请做)推荐您阅读以下答案 hxxps://超级用户.com/questions/323801/how-can-i-own-an-ip-address

如果你问你的 (现实世界) 邻居查找 https://whatismyipaddress.com/(他们和你有相同的 ISP 和月费计划)很有可能他们将看到与您看到的相同的 IP。简单来说,你在访问 whatismyipaddress 等站点时看到的 IP 是你的 ISP 分配给你所在的网络节点的 IP。给每个用户分配一个 IP 会浪费 IP(不是更何况从数学上讲,实际上并没有那么多 IP 可以这样做。

关于您目前的困境。我可以看到 3 个选项。

选项 1 - 购买主机

如果您的回答是 "I really really wanna have a separate IP"(或域),那么您将需要从托管服务购买一个 IP(好的 IP),该 IP 将指向托管公司拥有的设备。您通常会购买指向 IP 的域名,但我们现在暂且不谈。您将连接到那个 machine/devices 并在那里的服务器上安装您的代码。然后,也只有到那时,你才能得到那台机器的 IP/domain 并在你的代码中使用它,它就会工作(这是 1% 的情况,像 whatismyipaddress 这样的网站实际上会帮助你)。

推荐搜索:便宜的服务器托管 :D(如果您是学生,则可以免费为学生提供一些东西)

选项 2 - 在本地工作

如果您的项目用于学术界并且没有实际需要单独的服务器,那么您和您的合作伙伴将 运行 client/server 应用程序连接到同一个无线调制解调器。让他以这种方式获取他的 IP(这里你实际上需要 LAN IP),你将它硬编码在你的代码中(最好是一个单独的配置文件,这样不需要额外的编译)并且瞧,它有效。

选项 3 - 互联网局域网

从技术上讲,这很难描述,但想法是您使用通过互联网通信的程序,每个人都将其安装在您的计算机上,以某种方式相互连接(通常是 name/password 对)并且对于您计算机上的程序来说,软件制作似乎是您实际上处于 LAN 设置中 (选项 2)。在我的日子里,我使用 hamachi 以便我们可以在线玩 CS :D.

  • hxxps://www.howtogeek.com/172762/how-to-play-old-lan-games-over-the-internet/

关于#2

在您的合作伙伴提供服务器之前,您需要测试您的代码。因此,您需要以某种方式伪造服务器响应,以便您可以真正继续开发。

很简单,在你的代码中伪造一些东西,一个return/a class,这样你就可以正确地开发和测试你的代码的操作被称为模拟

如何模拟服务器响应 asp.net

  • hxxps://gingter.org/2018/07/26/how-to-mock-httpclient-in-your-net-c-unit-tests/

对于初学者来说,我认为这是最复杂的部分之一。模拟和测试的概念虽然看起来很简单,但通常不会铭刻在年轻、天真、以前未受污染的未来程序员的脑海中。在毕业之前,他们一直被 printfs 困住(甚至对测试的仇恨也混杂其中,真是可惜)。

出于礼貌,我希望进一步扩展这种疯狂。 拜托,为了这个世界上所有美好和神圣的东西,不要在生产中使用这个代码,在你使用它了解一些基础知识之后燃烧它,BURN IT!

我修改了此处 的代码,以便您可以 运行 在您的计算机上使用本地 HTTP 服务器并测试您的应用程序。您只需 运行 它 (python3) 并使用以下异教语法测试将用户名和密码发送到服务器:

127.0.0.1:4242/?user=aba&password=Aba1 会 return 我待会儿喝你

#!/usr/bin/python
from http.server import BaseHTTPRequestHandler,HTTPServer
from urllib.parse import urlparse, parse_qs
HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT_NUMBER = 4242  # Port to listen on (non-privileged ports are > 1023)

# !!!!!!!!!!!!!!! THIS IS ONLY FOR DIDACTICAL PURPOSE< NEVER EVER DO SOMETHING LIKE THIS IN PRODUCTION!!!!!!!
# NEVER EVER STORE PASSWORDS LIKE THIS !!!!!!!
# LITERRLAY NEVER!!!!!!
data_base = [
    {
        'user': 'ionzapada',
        'password': 'neaomat',
        'data': b"I like pie!"
    },
    {
        'user': 'aba',
        'password': 'Aba1',
        'data': b"I'al cohol you later"
    }
]

class myHandler(BaseHTTPRequestHandler):

    #Handler for the GET requests
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()
        # Send the html message

        query_components = parse_qs(urlparse(self.path).query)
        # DO NOT USE THIS LOGIC ON ANY PRODUCTION PLATFORM!!!!
        # NEVER SEND PASSWORDS THIS WAY!!! 
        # NEVER SEND PASSWORDS!!!! 
        # NEVER SEND HASHES WITHOUT SALT!!!! 
        # NEVER IMPLEMENT YOUR OWN TRICKY ALGORITHM!!!!
        user_name = query_components.get("user",[None])[0]
        password = query_components.get("password",[None])[0]
        if user_name and password:
            for data_base_entry in data_base:
                if data_base_entry['user'] == user_name:
                    print('Found searched user: {}'.format(user_name))
                    if data_base_entry['password'] == password:
                        print('Valid password for user {} given; returning db data'.format(user_name))
                        self.wfile.write(data_base_entry['data'])
                    else:
                        self.wfile.write(b"Not supported!")
        else:
            self.wfile.write(b"Not supported!")        
        return

try:
    server = HTTPServer((HOST, PORT_NUMBER), myHandler)
    print('Started httpserver on port', PORT_NUMBER)
    server.serve_forever()

except KeyboardInterrupt:
    print('CTRL+C received, shutting down the web server')
    server.socket.close()

我写那个烫到我的手指了,永远不要用这种方式发送用户名和密码!!!看在上帝的份上,甚至不要发送密码!!!!!!!!!搜索执行此操作的标准和安全方法!!!!

还请访问 @amc 指示的 link,它们也是一个好的开始。

P.S。我不允许在一个 post 中有超过 8 个 link,在一些 link 上,我 posted 将 hxxp 更改为 http 以使它们工作。