【问题标题】:How can I get JSON data from Google API and store it in a variable?如何从 Google API 获取 JSON 数据并将其存储在变量中?
【发布时间】:2016-05-30 23:23:28
【问题描述】:

我正在尝试向 Google 位置 Api 发送一条 Http Get 消息,该 Api 应该具有诸如此类的 Json 数据

https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt 正如您注意到的那样,响应是在 Json 中。我想对该 URL 进行 Http 调用并将 Json 内容保存在变量或字符串中。我的代码没有给出任何错误,但也没有返回任何内容

public async System.Threading.Tasks.Task<ActionResult> GetRequest()
{
    var client = new HttpClient();

    HttpResponseMessage response = await  client.GetAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
    string data = response.Content.ToString();
    return data;
}

我想使用 HttpClient() 或任何将发送 URL 请求的东西发送一个 Get 请求,然后将该内容保存到一个字符串变量中。任何建议都将不胜感激,我的代码再次没有错误,但没有返回任何内容。

【问题讨论】:

  • 发出请求的是什么类型的应用程序?这对答案有很大影响。
  • 这是一个 MVC4 应用程序,我基本上是在提交控制器操作时进行调用。我将在上面发布更多代码。
  • 跟随api的树,例如获取你需要写的long_name,results.adress_components.long_name

标签: c# json asp.net-mvc-4 google-api


【解决方案1】:

使用 ReadAsStringAsync 获取 json 响应...

static void Main(string[] args)
{
    HttpClient client = new HttpClient();
    Task.Run(async () =>
    {
        HttpResponseMessage response = await client.GetAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
        string responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseString);
    });
    Console.ReadLine();
}

如果您使用response.Content.ToString(),它实际上是将内容的数据类型转换为字符串,因此您将获得System.Net.Http.StreamContent

【讨论】:

    【解决方案2】:

    试试这个。

            var client = new HttpClient();
            HttpResponseMessage httpResponse = await client.GetAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
            string data = await httpResponse.Content.ReadAsStringAsync();
    

    【讨论】:

      【解决方案3】:

      Json framework 用于由 Newtonsoft 提供支持的 .NET 怎么样? 您可以尝试使用 this 将您的内容解析为字符串。

      【讨论】:

      • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
      【解决方案4】:

      嗯,你的代码可以简化:

      public async Task<ActionResult> GetRequest()
      {
        var client = new HttpClient();
        return await client.GetStringAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
      }
      

      不过……

      我的代码没有给出任何错误,但也没有返回任何内容

      这几乎可以肯定是由于在调用堆栈的上方使用了ResultWaitBlocking on asynchronous code like that causes a deadlock 我在我的博客上进行了完整的解释。简短的版本是有一个 ASP.NET 请求上下文,一次只允许一个线程; await 默认情况下将捕获当前上下文并在该上下文中恢复;并且由于Wait/Result 阻塞了请求上下文中的线程await 无法恢复执行。

      【讨论】:

        【解决方案5】:

        试试这个

        public async static Task<string> Something()
            {            
                var http = new HttpClient();
                var url = "https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt";
                var response = await http.GetAsync(url);
                if (response.IsSuccessStatusCode)
                {
                    var result = await response.Content.ReadAsStringAsync();
                    result = JsonConvert.DeserializeObject<string>(result);
                    return result;
                }
                return "";
            }
        
        var result = Task.Run(() => Something()).Result;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-19
          • 2018-11-11
          • 1970-01-01
          相关资源
          最近更新 更多