Amadeus для разработчиков, не знаете, как настроить? - PullRequest
0 голосов
/ 07 июня 2019

Итак, для домашней работы мне нужно создать приложение, которое будет использовать не 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();

Не могли бы вы помочь мне разобраться?

Ответы [ 2 ]

3 голосов
/ 10 июня 2019

Я написал пример кода на C #, заменив apikey и apisecret на те, которые вы получаете на портале, создав приложение. Вы можете найти руководство здесь .

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-offers?origin=LON&destination=NYC&departureDate=2020-01-01";
            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 отвечает за выполнение процесса авторизации (как объяснено здесь ).

Этот токен используется в вызове API (в методе Main). Он добавляется в заголовок авторизации со значением: Bearer {token}

1 голос
/ 26 июня 2019

Во-первых, вам нужно получить токен доступа, чтобы получить данные. Как я это делаю, вы можете увидеть в коде ниже.

[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;
    }

Эта часть кода предназначена для получения токена доступа

.
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;
    }

Остальная часть кода предоставляет данные в соответствии с параметрами, введенными пользователем.

...