Amadeus for Developers,不知道如何配置?

Amadeus for Developers, don't know how to configure?

所以,为了我的家庭作业,我需要制作一个应用程序,它不会使用 SQL(像我以前那样),但其余的 api。问题是我没做过,也不知道怎么配置。

到目前为止我得到了这个:

string strUrlTest = String.Format("https://test.api.amadeus.com/v1/shopping/flight-offers");
WebRequest requestObjGet = WebRequest.Create(strUrlTest);

requestObjGet.Method = "GET";
requestObjGet.Headers.Add("API KEY", 
"API SECRET);

HttpWebResponse responseObjGet = null;
responseObjGet = (HttpWebResponse)requestObjGet.GetResponse();

string strResultTest = null;
using(Stream stream = responseObjGet.GetResponseStream())
{
    StreamReader sr = new StreamReader(stream);
    strResultTest = sr.ReadToEnd();
    sr.Close();
}

我只是想用调试器看看我是否得到了我所有的数据,但我的程序在

崩溃了
responseObjGet = (HttpWebResponse)requestObjGet.GetResponse();

你能帮我解决一下吗?

我用 C# 编写了一个代码示例,将 apikeyapisecret 替换为您通过创建应用程序在门户网站上获得的代码示例。您可以找到指南 here.

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace testApp
{
    public class AmadeusTest
    {
        static void Main()
        {
            const string URL = "https://test.api.amadeus.com/v1/shopping/flight-destinations?origin=BOS";
            string token = getToken();
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(URL);
            client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer " + token);
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "");

            Task<HttpResponseMessage> response = client.SendAsync(request);
            string myJsonResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(response.Result.Content.ReadAsStringAsync().Result).ToString();
            JObject jsonObject = JObject.Parse(myJsonResponse);

            Console.WriteLine(myJsonResponse);
            Console.WriteLine(jsonObject["data"][0]["destination"]);
            client.Dispose();
    }

    private static string getToken()
    {
        const string apikey = "";
        const string apisecret = "";
        const string tokenURL = "https://test.api.amadeus.com/v1/security/oauth2/token";

        string postData = $"grant_type=client_credentials&client_id={apikey}&client_secret={apisecret}";
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(tokenURL);

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "");
        request.Content = new StringContent(postData,
                                Encoding.UTF8,
                                "application/x-www-form-urlencoded");

        Task<HttpResponseMessage> response = client.SendAsync(request);
        if (response.Result.IsSuccessStatusCode)
        {
            string myJsonResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(response.Result.Content.ReadAsStringAsync().Result).ToString();
            JObject jsonObject = JObject.Parse(myJsonResponse);
            client.Dispose();

            string token = (string)jsonObject["access_token"];
            return token;
        }
        else
        {
            Console.WriteLine("{0} ({1})", (int)response.Result.StatusCode, response.Result.ReasonPhrase);
            return response.Result.ReasonPhrase;
        }
      }
   }
}

getToken 方法负责执行授权过程(如 here 所述)。

此标记用于 API 调用(在 Main 方法中)。它被添加到授权 header 中,其值为:Bearer {token}

首先,您需要获取访问令牌,以检索数据。我是如何做到这一点的,您可以在下面的代码中看到。

[HttpGet("[action]")]
    public async Task<List<FlightOffersModel>> GetData(string origin, string destination, string departureDate, string returnDate, string adults, string currency)
    {

        const string client_id = "oqsIlG0xAbnlXXXXXXXXXXg7GdYwemI5";
        const string client_secret = "lAcXXXXXXXXX5AD0";
        string token = await GetToken(client_id, client_secret);

        const string baseUrl = "https://test.api.amadeus.com/v1/";
        string urlParams = "shopping/flight-offers?origin=" + origin + "&destination=" + destination + "&departureDate=" + departureDate;
        urlParams += returnDate == "" || returnDate == null ? "" : "&returnDate=" + returnDate;
        urlParams += "&adults=" + adults + "&nonStop=false&currency=" + currency + "&max=50";
        FlightOffer ff = null;
        List<FlightOffersModel> model = new List<FlightOffersModel>();

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(baseUrl);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.amadeus+json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

            HttpResponseMessage response = await client.GetAsync(urlParams);
            if (response.IsSuccessStatusCode)
            {
                var x = await response.Content.ReadAsStringAsync();
                var xx = JObject.Parse(x);
                ff = JsonConvert.DeserializeObject<FlightOffer>(xx.ToString());

                foreach (var fo in ff.Data)
                {
                    FlightOffersModel temp = new FlightOffersModel();
                    foreach (var item in fo.OfferItems)
                    {
                        foreach (var service in item.Services)
                        {
                            if (item.Services.IndexOf(service) < 1)
                            {
                                temp.BrojPresjedanjaPovratak = item.Services.Length > 1 ? GetBrojPresjedanja(item.Services[1]) : 0;
                                temp.BrojPresjedanjaOdlazak = GetBrojPresjedanja(item.Services[0]);
                                temp.BrojPutnika = GetBrojPutnika(service.Segments);
                                temp.UkupnaCijena = item.Price.Total;
                                temp.Valuta = ff.Meta.Currency;
                                temp.PolazniAerodrom = GetAerodromName(service.Segments, "departure", ff.Dictionaries.Locations);
                                temp.OdredisniAerodrom = GetAerodromName(service.Segments, "arrival", ff.Dictionaries.Locations);
                                temp.DatumPolaska = GetDatumLeta(service.Segments, "departure");
                                temp.DatumPovratka = GetDatumLeta(service.Segments, "arrival");

                                model.Add(temp);
                            }
                        }
                    }
                }
            }
        }
        return model;
    }

这部分代码是获取access token

const string client_id = "oqsIlG0xAbnlXXXXXXXXXXg7GdYwemI5";
    const string client_secret = "lAcXXXXXXXXX5AD0";
    string token = await GetToken(client_id, client_secret);

这是 GetToken 函数:

private async Task<string> GetToken(string client_id, string client_secret)
    {
        AccessToken s = null;
        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://test.api.amadeus.com/v1/security/oauth2/token"))
            {
                request.Content = new StringContent("grant_type=client_credentials&client_id=" + client_id + "&client_secret=" + client_secret, Encoding.UTF8, "application/x-www-form-urlencoded");

                HttpResponseMessage response = await httpClient.SendAsync(request);

                if (response.IsSuccessStatusCode)
                {
                    s = await response.Content.ReadAsAsync<AccessToken>();
                }
            }
        }

        return s.Access_token;
    }

其余代码根据用户输入的参数提供数据。