【问题标题】:Postman can query lcoal API, identical request send from android emulator can'tPostman可以查询lcoal API,从android模拟器发送的相同请求不能
【发布时间】:2021-03-06 19:25:21
【问题描述】:

我看到了一些类似的问题,但这里似乎没有什么完全符合我的问题。

我正在本地运行我的 API (C#) 版本来测试一些更新。它连接到本地 SQL 数据库。

当我运行查询以获取令牌时,邮递员按预期工作。但是,当我启动我的 android 模拟器 (xamarin) 并运行相同的查询时,请求几乎立即超时,错误代码为 0。我已将其设置为根本不超时。另一个奇怪的是,当我在本地 API 中设置断点时,postman 会触发这些断点,但 android 应用不会。

这很奇怪,因为邮递员和 android 应用都可以在服务器中查询 API 的实时版本。

我听说这可能是 CORS 问题?

重现问题的步骤:

  1. 启动本地 API,将网页打开到本地端口。
  2. 通过使用邮递员发送请求来测试端口是否正常工作。我尝试的请求是请求令牌。
  3. 使用 postman 生成 restsharp 代码,并从 xamarin android 项目中运行该代码。

我得到的错误总是状态码 0。

代码:

以下代码是在请求成功后通过邮递员生成的。

var client = new RestClient("http://localhost:53884/token");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("Cookie", ".AspNet.Cookies=7u9...JRrb");
request.AddParameter("username", "redacted");
request.AddParameter("password", "redacted2");
request.AddParameter("grant_type", "password");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

由于 IP 的原因,我无法共享 API 代码,但它在服务器上运行时适用于应用程序,并且适用于本地和邮递员。

【问题讨论】:

  • “假设”您在 Android 应用中使用 localhost 连接到本地托管服务?即模拟器上的localhost 是模拟器本身,而不是托管模拟器的PC
  • “有些东西有效,有些东西不...弄清楚我的问题是什么”谜题并不是真正的主题。您需要edit 问题的详细信息,以便人们理解并理想地预先产生问题。 “运行查询以获取令牌”实际上并不是对问题的具体描述——实际上,将所有可能的问题缩小到只是 HTTP 请求的所有可能问题是朝着解释具体问题迈出的重要一步得到答案。
  • @SushiHangover 我没有想到这一点。这可以解释为什么请求永远不会到达 API。我会调查一下并报告。
  • 有数百个问题,如果不是更多,处理使用 localhost 从移动应用程序查询服务的问题。几乎普遍的答案是“使用 IP 或 FQDN”

标签: c# android api xamarin


【解决方案1】:

我已经解决了我的问题,所以我将转发我采取的步骤。

这是假设您在本地运行 API,并且您希望能够使用您的 android 模拟器访问本地主机。作为记录,我的 android 模拟器正在运行我的 xamarin 应用程序,但它应该适用于任何应用程序。

  1. 安装 Conveyer(我按照these 的说明进行操作)
  2. 关闭 Visual Studio。
  3. 允许安装传送带
  4. 再次打开 Visual Studio
  5. 当提示有关防火墙时,让 Conveyer 自动设置您的帖子
  6. 打开您的 API 解决方案
  7. 右键单击您的 API 项目并选择“设置为启动项目”
  8. 顶部绿色运行箭头旁边的文本应更改。我的更改为“IIS Express(Microsoft Edge)”。我相信您可以在网络配置文件中更改此设置。
  9. 按绿色箭头。这应该做一些事情。首先,它应该在 localhost 地址打开浏览器。对我来说是 http://localhost:53884/ 。如果您收到诸如“'/' 应用程序中的服务器错误”之类的错误,请不要担心。虽然我假设如果您遇到与我完全相同的问题,但您的问题也在邮递员工作,所以您已经走到了这一步。
  10. 在Visual Studio 的底部,将有一个名为“Conveyer by Keyoti”的选项卡。单击它以显示 URL。复制 http 远程 URL 地址。
  11. 现在打开您的 xamarin 应用,在您设置 API 地址的任何位置(您有本地主机的位置),将该地址替换为删除 URL 地址。
  12. 运行您的 xamarin 应用,它现在应该可以访问 API。

我会说,我还没有让 https 删除 URL 工作。我收到错误:错误:SecureChannelFailure(身份验证失败,因为远程方已关闭传输流。)。我的 API 允许 HTTP 和 HTTPS 请求,所以 HTTP 适合我,但如果我让 HTTPS 工作,我会添加一个编辑,说明我是如何做到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 2019-01-20
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2017-08-01
    • 2013-10-02
    相关资源
    最近更新 更多