【问题标题】:How can I connect front-end with back-end?如何连接前端和后端?
【发布时间】:2020-04-14 17:45:57
【问题描述】:

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

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

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

如何进行数据传输?

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

【问题讨论】:

标签: python asp.net authentication client-server


【解决方案1】:

您的问题非常广泛,虽然我对 Web 应用程序不是很流利,但我会分享我能提供的建议。因为这个问题很宽泛,所以你无法得到一个准确、简短和简洁的答案。

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

我有一个用 ASP.NET 创建的网页(前端)...

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

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

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

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

因为您正在尝试一项更复杂的任务,所以您无法摆脱对设计模式的想法(尤其是因为使用了设计为对模式友好的 ASP.NET)。

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

如何与 web 服务器 asp.net 通信

另一种可能的方式是

如何将数据传输到服务器 C#

根据您的解释,我假设您已经实现了将检索输入数据的 UI 表单,因此我将跳过与 UI 相关的问题。

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

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

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

还有 2 个问题我想讨论。

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

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

解决 #1

为什么使用 localhost (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. 开头,则它是本地/私有IP 地址。请在此处阅读更多内容:https://en.wikipedia.org/wiki/Private_network

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

IP 地址空间由互联网号码分配机构 (IANA) 和五个区域互联网注册管理机构 (RIR) 在其指定领土内负责分配给本地互联网注册管理机构,例如互联网服务提供商和其他终端用户。

维基引用:https://en.wikipedia.org/wiki/IP_address

我也高度(请这样做)建议您阅读以下答案 hxxps://superuser.com/questions/323801/how-can-i-own-an-ip-address

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

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

选项 1 - 购买主机

如果您的回答是“我真的很想拥有一个单独的 IP”(或域),那么您需要从托管服务购买一个指向托管公司拥有的设备的 IP(好的类型)。您通常会购买指向 IP 的域,但我们暂时先不考虑。您将连接到该机器/设备并在那里的服务器上安装您的代码。然后,只有这样,您才能获得该机器的 IP/域并在您的代码中使用它,它就会起作用(这是 1% 的情况,whatismyipaddress 之类的网站实际上会帮助您)。

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

选项 2 - 在本地工作

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

选项 3 - 互联网上的 LAN

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

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

关于#2

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

很简单,在你的代码中伪造一些东西,一个返回/一个类,以便你可以正确地开发和测试你的代码的操作被称为模拟

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

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

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

出于礼貌,我希望进一步扩大这种疯狂。 拜托,对于这个世界上所有美好和神圣的事物,请不要在生产中使用此代码,在您使用它了解一些基础知识后将其烧掉,烧掉它!

我从这里 Python 3.x BaseHTTPServer or http.server 修改了代码,以便您可以在您的机器上运行本地 HTTP 服务器并测试您的应用程序。您只需运行它(python3)并使用以下异教语法测试将用户名和密码发送到服务器:

127.0.0.1:4242/?user=aba&password=Aba1 这将返回 I'al cohol you later

#!/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 指示的链接,它们也是一个好的开始。

附注我不允许在一篇文章中包含超过 8 个链接,在我发布的某些链接上,将 hxxp 更改为 http 以便它们工作。

【讨论】:

  • 我赞成这个努力,因为这里有一些好主意。然而,正如你所说,这个问题太宽泛了,最好不要回答这类问题——它们不适合 Stack Overflow。他们在 Reddit 和其他允许讨论性问题和我如何开始的问题的地方都可以,但答案的质量(以及获得任何答案的可能性)相当混杂。
  • 我们也不鼓励喋喋不休和对话式的回复——我已经尝试过修改一下,但我会避开大写的大喊大叫和冗长的回复!!!!!!流的重点。这里鼓励技术写作和简洁。
猜你喜欢
  • 2021-07-06
  • 2018-02-18
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多