【问题标题】:Call works in Postman but not in C#调用在 Postman 中有效,但在 C# 中无效
【发布时间】:2020-04-06 06:48:40
【问题描述】:

我正在尝试调用以下 URL,它在浏览器 (Chrome) 和 Postman 中都可以正常工作,但由于某种原因,它在 C# 中不起作用。

在浏览器中工作:
http://AJWKBLWT47VR26QWPNFCPJLXC6217F6F@presta.craftingcrow.com/api/categories

在 Postman 工作:
http://AJWKBLWT47VR26QWPNFCPJLXC6217F6F@presta.craftingcrow.com/api/categories

不适用于 C# (RestSharp):

var client = new RestClient("http://AJWKBLWT47VR26QWPNFCPJLXC6217F6F@presta.craftingcrow.com/api/categories"); 
var request = new RestRequest(Method.GET);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("User-Agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
IRestResponse response = client.Execute(request);

回应: 401 未授权

附:如果我删除 User-Agent 它仍然不起作用。为什么我在这里做错了?

【问题讨论】:

  • 好吧,根据内容,您似乎收到了401 错误,因此您可能需要发送某种Authorization 标头。您如何在邮递员/浏览器中验证该端点?
  • 正如@Joshua 指出的那样,缺少身份验证。该信息被附加到网址上。将其移至授权标头:request.AddHeader("Authorization", "Basic" + Convert.ToBase64String(Encoding.Default.GetBytes("AJWKBLWT47VR26QWPNFCPJLXC6217F6F:"));
  • 谢谢你们!这正是我所缺少的。我不确定为什么它在没有任何授权标头的情况下在 Postman 中工作。添加此代码 sn-p 后,它就像一个魅力。

标签: c# postman restsharp


【解决方案1】:

进入邮递员,提交请求后,如果您未在“授权”选项卡中指定任何内容,请检查“临时标头”部分中可能添加的任何内容。

在此示例中,我没有调用 Authorization 标头,但 Postman 仍然提供了一个:

然后将缺少的相关标头添加到您的代码中。我喜欢单击请求最右侧的“代码”按钮。它为您提供了一个下拉菜单,以便您可以选择所需语言的预生成代码。这很可能会给你一个可重现的例子。

【讨论】:

    【解决方案2】:

    RestClient 构造函数接受不包含 userinfo 的 URI

              userinfo       host      port
              ┌──┴───┐ ┌──────┴──────┐ ┌┴┐
      https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top
      └─┬─┘   └───────────┬──────────────┘└───────┬───────┘ └───────────┬─────────────┘ └┬┘
      scheme          authority                  path                 query           fragment
    

    见:https://en.wikipedia.org/wiki/Uniform_Resource_Identifier

    为了让它与 RestSharp 一起工作,我们需要在这里做一些额外的工作:

    // Old:
    // var client = new RestClient("http://AJWKBLWT47VR26QWPNFCPJLXC6217F6F@presta.craftingcrow.com/api/categories"); 
    
    // New:
    var client = new RestClient("http://presta.craftingcrow.com/api/categories")
    {
        Authenticator = new HttpBasicAuthenticator("AJWKBLWT47VR26QWPNFCPJLXC6217F6F", "")
    };
    

    【讨论】:

      【解决方案3】:

      感谢 Joshua 和 Vhoang!

      我将代码更改为以下代码后它正在工作:

      var client = new RestClient("http://presta.craftingcrow.com/api/categories"); 
      var request = new RestRequest(Method.GET);
      request.AddHeader("cache-control", "no-cache");
      request.AddHeader("Authorization", "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("AJWKBLWT47VR26QWPNFCPJLXC6217F6F:"));
      IRestResponse response = client.Execute(request);
      

      无需添加用户代理或在主机名 (URL) 中包含密钥

      【讨论】:

        猜你喜欢
        • 2021-11-02
        • 2021-09-19
        • 2019-11-11
        • 1970-01-01
        • 2018-07-14
        • 2020-04-28
        • 1970-01-01
        • 2019-11-28
        • 2020-10-15
        相关资源
        最近更新 更多