【问题标题】:'An invalid request URI was provided. The request URI must either be an absolute URI or BaseAddress must be set.''提供了无效的请求 URI。请求 URI 必须是绝对 URI,或者必须设置 BaseAddress。
【发布时间】:2020-11-22 16:46:20
【问题描述】:

我正在尝试使用以下代码从 xamarin 表单应用程序中使用 REST API。但是由于某些奇怪的原因,我收到了无效的 URI 错误。我还尝试在 PostAsync 方法中使用绝对路径,但错误仍然存​​在。有人可以指导我吗?

HttpClient client = new HttpClient(); 
string baseAdd = @"http://localhost:9000/";

    public async void GenerateAPIToken()
    {

        string tsResult = "";
        try
        {

            Token token = new Token();
            //GET TOKEN
            client.BaseAddress = new Uri(baseAdd);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpRequestMessage msg = new HttpRequestMessage();
            msg.Content = new StringContent(@"{""username"":""admin"",""password"":""admin123""}");


            HttpResponseMessage response = await client.PostAsync(client.BaseAddress+"token/generate.php", msg.Content);


            if (response.StatusCode == HttpStatusCode.OK)
            {
                HttpContent cnt = response.Content;
                tsResult = await cnt.ReadAsStringAsync();
                token = JsonConvert.DeserializeObject<Token>(tsResult);
                App.apiToken = token.Document.AccessToken;
            }

        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

    }

【问题讨论】:

  • string baseAdd 具有以下值:localhost:9000 请参阅上面的代码,因为在 oomment 中它正在下拉斜杠和 Http 协议
  • client.BaseAddress+"token/generate.php" - BaseAddress 已被 HttpClient 添加。这意味着它将被添加两次。您可能还希望您的 BaseAddress 以 http://https:// 开头
  • @canton7 我试过只传递“token/generate.php”,并在 PostAsync 参数中提供了一个绝对 URL,但仍然是同样的错误。基地址包括协议 http:// 它只是出于某种原因从 stackoverflow 的推荐中删除
  • 这能回答你的问题吗? Why is HttpClient BaseAddress not working?

标签: c#


【解决方案1】:

看起来您正在设置 BaseAddress 并发送绝对 URI。 设置 BaseAddress 后,会将其作为前缀添加到 URI。 您必须设置 BaseAddress 并发送相对 URI,或者发送绝对 URI 而不设置基地址。 看 https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.baseaddress?view=netcore-3.1

【讨论】:

  • 感谢您的帮助。根据你发给我的文档,上面的代码应该如何修改?
  • @cvdev 要么不要设置client.BaseAddress,要么不要在client.PostAsync中连接它。
  • 我试图在 PostAsyc 方法中提供整个 URL,但奇怪的是仍然出现同样的错误
  • 也试过了,但仍然弹出同样的错误....无法理解为什么使用 REST API 很长时间了
猜你喜欢
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2020-01-07
  • 2019-01-15
  • 2021-07-30
  • 2018-10-01
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多