在 ASP.NET MVC C# 中的 Saber 中设置授权 Headers 和访问数据响应
Setting Authorization Headers and accessing data response in Sabre in ASP.NET MVC C#
我正在建立一个网站来使用 Insta Flight Search API by Sabre. After thoroughly reading the docs provided by them and testing the API in the API Explorer 搜索航班数据,其中一切都完美运行,让我确切地知道 API 将如何工作。
首先,我刚刚创建了一个简单的表格,其中包含 2 个 select 框,用于提供来源和目的地 IATA 代码,以及 2 个日期输入框,用于提供出发日期和 return 日期。一个多星期以来,我一直在寻找解决方案并尝试了各种找到的解决方案,但每次我都收到 400 BAD REQUEST 或 401 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?
我知道我错过了一些非常愚蠢的东西,但在尝试了我能想到的一切之后,我向社区求助。我附上了两个代码文件。
注意:注释代码代表我尝试过的各种方法
控制器代码:
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();
}
}
}
Index.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 问题。
- c# - How do I encode and decode a base64 string?
- How to post data to specific URL using WebClient in C#
最终编辑
经过数周的努力寻找可能的解决方案后,我在回复的格式中找到了答案。 JSON object 包含 objects 作为 " 包围中的字符串,但整个响应也是一个字符串,使内部 " 包围到 \"
但上个月让我意识到 ASP.NET MVC C# 中的开发人员需要一个合适的 Saber 教程,所以我将发布博客 post 和其他同行的 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);
}
}
假设您首先使用 /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);
}
经过数周的努力寻找可能的解决方案后,我在回复的格式中找到了答案。 JSON 对象包含对象作为 " 包围中的字符串,但整个响应也是一个字符串,使内部 " 包围到 \"
但上个月让我意识到 ASP.NET MVC C# 中的开发人员需要一个合适的 Saber 教程,所以我将发布一个博客 post 和一个 Nuget 包供其他同行使用。我会在链接上线后分享它们。
编码愉快。
我正在建立一个网站来使用 Insta Flight Search API by Sabre. After thoroughly reading the docs provided by them and testing the API in the API Explorer 搜索航班数据,其中一切都完美运行,让我确切地知道 API 将如何工作。
首先,我刚刚创建了一个简单的表格,其中包含 2 个 select 框,用于提供来源和目的地 IATA 代码,以及 2 个日期输入框,用于提供出发日期和 return 日期。一个多星期以来,我一直在寻找解决方案并尝试了各种找到的解决方案,但每次我都收到 400 BAD REQUEST 或 401 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?
我知道我错过了一些非常愚蠢的东西,但在尝试了我能想到的一切之后,我向社区求助。我附上了两个代码文件。
注意:注释代码代表我尝试过的各种方法
控制器代码:
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();
}
}
}
Index.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 问题。
- c# - How do I encode and decode a base64 string?
- How to post data to specific URL using WebClient in C#
最终编辑
经过数周的努力寻找可能的解决方案后,我在回复的格式中找到了答案。 JSON object 包含 objects 作为 " 包围中的字符串,但整个响应也是一个字符串,使内部 " 包围到 \"
但上个月让我意识到 ASP.NET MVC C# 中的开发人员需要一个合适的 Saber 教程,所以我将发布博客 post 和其他同行的 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);
}
}
假设您首先使用 /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);
}
经过数周的努力寻找可能的解决方案后,我在回复的格式中找到了答案。 JSON 对象包含对象作为 " 包围中的字符串,但整个响应也是一个字符串,使内部 " 包围到 \"
但上个月让我意识到 ASP.NET MVC C# 中的开发人员需要一个合适的 Saber 教程,所以我将发布一个博客 post 和一个 Nuget 包供其他同行使用。我会在链接上线后分享它们。
编码愉快。