我正在建立一个网站,使用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。我们会在他们上线后分享这些链接。
答案 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。我会在他们上线后分享链接。
快乐编码。