[英]Setting Authorization Headers and accessing data response in Sabre in ASP.NET MVC C#
我正在建立一個網站,以使用Sabre的Insta Flight Search API搜索航班數據。 仔細閱讀他們提供的文檔並在API Explorer中測試API之后,一切都可以正常運行,這給了我API如何工作的確切思路。
首先,我剛剛創建了一個簡單的表單,其中包含2個提供源和目的地IATA代碼的選擇框,以及2個提供出發日期和返回日期的日期輸入框。 我一直在尋找解決方案一個多星期,並嘗試了各種發現的解決方案,但是每當我收到400錯誤請求或401未經授權的回復時,就可以找到解決方案。
我還檢查了演示庫,但在撰寫本文時,還沒有C#的示例,即使在Stack-Overflow上,也只有78個標記為saber的問題,只有1個標記為saber和C#的問題。
我聯系了支持人員,但收到了回復。
請記住,我們不提供代碼支持。 您可以共享XML(Sabre)文件嗎?
我知道我確實缺少一些愚蠢的東西,但是在嘗試了所有我能想到的東西之后,我向社區求助。 我將附加兩個代碼文件。
注意:注釋的代碼表示我嘗試過的各種方法
控制器代碼:
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
與我的問題最接近,但沒有解決我的問題的其他堆棧溢出問題。
最后編輯
經過數周的可能解決方案的努力,我在響應的格式中找到了答案。 JSON對象在“包含”中將對象包含為字符串,但整個響應也是一個字符串,使內部“包含為\\”
但是上個月讓我意識到為ASP.NET MVC C#中的開發人員提供Sabre適當的教程的必要,因此我將為其他同行發布博客文章和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#中的開發人員提供Sabre適當的教程的必要,因此我將為其他同行發布博客文章和Nuget包。 一旦鏈接生效,我將分享它們。
編碼愉快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.