在ASP.NET MVC C#中设置授权标头并访问Sabre中的数据响应

时间:2016-01-18 07:28:38

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

我正在建立一个网站,使用Sabre的Insta Flight Search API搜索航班数据。在彻底阅读了他们提供的文档并在API Explorer中测试API之后,其中所有内容都能完美地完成,让我了解API的工作原理。

首先,我创建了一个简单的表单,其中包含2个选择框,提供源和目标IATA代码,以及2个日期输入框,给出出发和返回日期。我一直在寻找解决方案超过一周,并尝试了我找到的各种解决方案,但每次我得到 400 BAD REQUEST 401 UNAUTHORIZED 响应。

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

我联系了支持部门,但收到了回复。

  

请注意,我们不提供代码支持。你能否分享一下XML(Sabre)文件?

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

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

控制器代码:

<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

Index.cshtml:

ReplaceAt(serial, 5, 0, "-");


public static string ReplaceAt(string str, int index, int length, string replace)
        {
            return str.Remove(index, Math.Min(length, str.Length - index))
                    .Insert(index, replace);
        }

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

最终编辑

经过数周的可能解决方案的努力,我找到了答案格式的答案。 JSON对象将对象包含为&#34;中的字符串。封闭,但整个响应也是一个字符串,使内部&#34;附在\&#34;

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

3 个答案:

答案 0 :(得分:0)

以下代码对我来说很好。

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

答案 1 :(得分:0)

假设您首先使用/v2/auth/token REST service获取访问令牌,对吧?

https://developer.sabre.com/docs/read/rest_basics/authentication

另外,你能尝试这种方法吗?

// Add this on top
using System.Net.Http.Headers;
// then......
//....... 

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
        data = await client.GetStringAsync(url);

    }

答案 2 :(得分:0)

经过数周的可能解决方案的努力,我找到了答案格式的答案。 JSON对象在“封闭”中包含对象作为字符串,但整个响应也是一个字符串,使内部“封闭到”

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

快乐编码。