【问题标题】:Accessing local api with C #使用 C# 访问本地 api
【发布时间】:2018-07-06 15:16:27
【问题描述】:

我正在用 PHP 开发一个 API,我在其中返回一个 json 文件,我在邮递员中执行测试,它与 url 完美配合

http://localhost:80/bdevApi/api/index/keyacessoUbasd42123/CategoriaExame

还给我

{
    "code": "200",
    "result": true,
    "message": "",
    "data": {
        "item": [
            {
                "id": "5",
                "descricao": "TesteDesc",
                "observacao": "TesteObs",
                "status": "1"
            },
            {
                "id": "7",
                "descricao": "TesteDesc",
                "observacao": "TesteObs",
                "status": "1"
            },
        ],
        "count": 15
    }
}

现在我想在使用 WPF 的 C# 应用程序中接收此信息。我已经导入了客户端

public partial class MainWindow : Window
    {
        HttpClient client = new HttpClient();

        public MainWindow()
        {
            InitializeComponent();

            client.BaseAddress = new Uri("http://localhost:80");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            this.Loaded += MainWindow_Loaded;

            getStatusContent();
            getCategorias();
        }

        async void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                HttpResponseMessage response = await client.GetAsync("/bdevApi/api/index/keyacessoUbasd42123/CategoriaExame");
                response.EnsureSuccessStatusCode(); // Lança um código de erro
                var getData = await response.Content.ReadAsAsync<IEnumerable<Categoria>>();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }
}

我想接收信息并在我的 var getData 中检索它,但是它正在加载错误

响应状态码不表示成功:406不可接受

我已经在 url 中尝试了一些修改但我没有成功。问题出在网址上?

【问题讨论】:

  • 你能调试你正在访问的api吗?并尝试删除 DefaultHeader (或者您是否也使用邮递员发送过?) 406 表示服务器无法满足您请求的答案格式...可能服务器上未正确处理 Accept Header,邮递员可能不会发送它,因此不会触发问题
  • 请注意,HttpClient 对基地址和请求路径有点迂腐。 (尽管我认为这不是问题所在)。为了安全起见(尤其是在将部分路径添加到基地址并使用相对请求路径时)您必须在基地址的末尾添加 / 并且不得 在请求路径的开头添加一个/ (stackoverflow.com/questions/23438416/…)
  • 我没有定义邮递员,我会删除它。我通过url将访问密钥传递给我的api,你认为这有什么问题吗?
  • 如果它与您在邮递员中使用的网址完全相同,那应该不是问题。但是您应该尝试像在邮递员中那样发送完全相同的请求。即没有额外的标题,...
  • 这是标题的问题。感谢您的帮助

标签: c# api http httpclient


【解决方案1】:

如评论所述,删除 Accept 标头。似乎 API 无法正确处理。

关于你的第二个要求。您可以将其阅读为 string 并使用 Newtonsoft Json.NET 之类的库进行解析

var json = await content.Response.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<IEnumerable<Categoria>>(json);

【讨论】:

猜你喜欢
  • 2017-10-19
  • 2019-10-13
  • 2019-09-13
  • 1970-01-01
  • 2010-12-04
  • 2011-06-11
  • 1970-01-01
  • 2012-02-04
  • 2020-10-24
相关资源
最近更新 更多