c# - 在 ASP.NET MVC C# 中的 Saber 中设置授权 header 和访问数据响应

标签 c# asp.net asp.net-mvc sabre

我正在构建一个网站来使用 Insta Flight Search API 搜索航类数据军刀。在彻底阅读了他们提供的文档并测试了 API Explorer 中的 API 之后一切都完美地工作,让我确切地知道 API 将如何工作。

首先,我刚刚创建了一个简单的表单,其中包含 2 个提供来源和目的地 IATA 代码的选择框,以及 2 个提供出发和返回日期的日期输入框。一个多星期以来,我一直在寻找解决方案并尝试了我找到的各种解决方案,但每次我都收到 400 BAD REQUEST401 UNAUTHORIZED 响应。

我还检查了 Demo Gallery但在撰写本文时,没有 C# 示例,即使在 Stack-Overflow 上也只有 78 个问题标记为 saber,只有 1 个问题标记为 saber 和 C#

我联系了支持人员,但收到了回复。

Please bear in mind that we do not provide code support. Could you please share the XML (Sabre) files?

我知道我遗漏了一些非常愚蠢的东西,但在尝试了我能想到的一切之后,我向社区寻求帮助。我附上了两个代码文件。

注意:注释的代码代表我尝试过的各种方法

Controller 代码:

using System;
using System.Net;
using System.Net.Http;
using System.Web.Mvc;
using System.Threading.Tasks;

namespace Sabre_sample_1.Controllers
{
    public class HomeController : Controller
    {
        public async Task<ActionResult> Index()
        {
            if (Request.HttpMethod == "POST")
            {
            string Origin = Request.Form["Origin"];
            string Destination = Request.Form["Destination"];
            DateTime Departure = Convert.ToDateTime(Request.Form["Departure"]);
            string departuredatestr = Departure.Year.ToString() + "-" + Departure.Month.ToString() + "-" + Departure.Day.ToString();
            DateTime Return = Convert.ToDateTime(Request.Form["Return"]);
            string returndatestr = Return.Year.ToString() + "-" + Return.Month.ToString() + "-" + Return.Day.ToString();

            WebClient datawebclient = new WebClient();
            string url = "https://" + "api.test.sabre.com/v1/shop/flights?origin=" + Origin + "&destination=" + Destination
                + "&departuredate=" + departuredatestr + "&returndate=" + returndatestr + "&onlineitinerariesonly=N"
                + "&limit=10&offset=1&eticketsonly=N&sortby=totalfare&order=asc&sortby2=departuretime&order2=asc"
                + "&pointofsalecountry=US";
            string data = string.Empty;
            string AccessToken = "*Access Token*";
            //datawebclient.Headers.Add("Authorization", "Bearer " + AccessToken);
            //datawebclient.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + AccessToken);
            //datawebclient.Headers.Add(HttpRequestHeader.Authorization, AccessToken);
            //data = datawebclient.DownloadString(url);

            //HttpClient httpClient = new HttpClient();
            //httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", AccessToken);
            //data = await httpClient.GetStringAsync(url);

            using (var client = new HttpClient())
            {
                //url = "https://www.theidentityhub.com/{tenant}/api/identity/v1";
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + AccessToken);
                data = await client.GetStringAsync(url);
                // Parse JSON response.

            }

            ViewBag.url = url;
            ViewBag.data = data;
            //RedirectResult redirectresult = new RedirectResult(url);
        }
        return View();
    }
}
}

索引.cshtml :

<form class="form-horizontal" method="post">
<fieldset>
    <legend>Enter Details</legend>
    <div class="form-group">
        <label for="select" class="col-lg-2 control-label">Origin</label>
        <div class="col-lg-10">
            <select class="form-control" name="Origin" required>
                <option></option>
                <option value="JFK">John F. Kennedy International Airport</option>
                <option value="EZE">Ministro Pistarini</option>
                <option value="MIA">Miami International Airport</option>
            </select>
        </div>
    </div>
    <div class="form-group">
        <label for="select" class="col-lg-2 control-label">Destination</label>
        <div class="col-lg-10">
            <select class="form-control" name="Destination" required>
                <option></option>
                <option value="JFK">John F. Kennedy International Airport</option>
                <option value="EZE">Ministro Pistarini</option>
                <option value="MIA">Miami International Airport</option>
            </select>
        </div>
    </div>
    <div class="form-group">
        <label for="inputEmail" class="col-lg-2 control-label">Departure</label>
        <div class="col-lg-10">
            <input type="date" class="form-control" name="Departure"required>
        </div>
    </div>
    <div class="form-group">
        <label for="inputEmail" class="col-lg-2 control-label">Return</label>
        <div class="col-lg-10">
            <input type="date" class="form-control" name="Return" required>
        </div>
    </div>
    <div class="form-group">
        <div class="col-lg-10 col-lg-offset-2">
            <input name="endpointName" type="hidden" value="Air Search" class="form-control">
            <input name="methodName" type="hidden" value="InstaFlights Search" class="form-control">
            <input name="httpMethod" type="hidden" value="GET" class="form-control">
            <input name="methodUri" type="hidden" value="/v1/shop/flights" class="form-control">
            <button type="reset" class="btn btn-default">Cancel</button>
            <button type="submit" class="btn btn-primary">Submit</button>
        </div>
    </div>
</fieldset>
</form>
<h2>Url</h2>
@ViewBag.url
<hr />
<h2>Data</h2>
@ViewBag.data

其他最接近我的问题,但没有解决我的问题的 Stack Overflow 问题。

最终编辑

在与可能的解决方案进行了数周的斗争之后,我在响应的格式中找到了答案。一个 JSON 对象将对象作为字符串包含在 "包围中,但整个响应也是一个字符串,这使得内部 "包围到\"

但上个月让我意识到需要为 ASP.NET MVC C# 中的开发人员提供适当的 Saber 教程,因此我将为其他同行发布一篇博文和一个 Nuget 包。我会在链接上线后分享这些链接。

最佳答案

以下代码对我来说工作正常。

FlightObject f = new FlightObject();
string URL = "https://api.test.sabre.com/v2/shop/flights?origin=JFK&destination=LAX&departuredate=2016-02-04&returndate=2016-02-20&pointofsalecountry=US&passengercount=2";
using (var w = new WebClient())
{
    w.Headers.Add(HttpRequestHeader.Authorization, token_type + " " + access_token);
    string str = w.DownloadString(URL);
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(FlightObject));
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(str)))
    {
        f = (FlightObject)serializer.ReadObject(ms);
    }
}

关于c# - 在 ASP.NET MVC C# 中的 Saber 中设置授权 header 和访问数据响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34849280/

相关文章:

c# - 我可以使用 Word 2003 组件通过 C# 将 .doc 文件转换为 .pdf 吗?

c# - 三元运算符语法

c# - htmlDocument.GetElementById 返回具有相同名称的元素,而不是 id

asp.net - 如何从asp.net core中的Microsoft帐户获取外部登录配置文件图片

c# - 在网页中选择多个文件上传

c# - 设计一个 BigNumber 类

javascript - 获取子iframe中父页面的隐藏变量数据

javascript - 将列表的元组设置为 ViewData Mvc C#

asp.net-mvc - Fluent Validation - 潜在空值的条件验证

javascript - ASPX URL 产生一个 JSON 字符串,使用 jQuery DataTable 使用