SabreのInsta Flight Search APIを使用して、フライト データを検索する Web サイトを構築しています。彼らから提供されたドキュメントを徹底的に読み、API Explorerで API をテストした後、すべてが完全に機能し、API がどのように機能するかを正確に理解できました。
まず、出発地と目的地の IATA コードを提供する 2 つの選択ボックスと、出発日と帰国日を提供する 2 つの日付入力ボックスを備えた単純なフォームを作成しました。私は1週間以上解決策を探していて、見つけたさまざまな解決策を試しましたが、400 BAD REQUESTまたは401 UNAUTHORIZED応答のいずれかを受け取るたびに。
デモ ギャラリーもチェックしましたが、執筆時点では C# のサンプルはありませんでした。Stack-Overflow でも、saber のタグが付けられた 78 の質問と、saber と C# のタグが付けられた 1 つの質問しかありませんでした。
サポートに問い合わせましたが、返信がありました。
コードのサポートは提供していませんのでご注意ください。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
私の問題に最も近いが、私の問題を解決しなかった他のスタックオーバーフローの質問。
- c# - 基本認証を使用した Webclient / HttpWebRequest は、有効な URL に対して 404 が見つかりませんでした
- c# - HttpClient の Authorization ヘッダーの設定
- c# - base64 文字列をエンコードおよびデコードするにはどうすればよいですか?
- C# で WebClient を使用して特定の URL にデータを投稿する方法
最終編集
考えられる解決策に何週間も苦労した後、応答のフォーマットに答えが見つかりました。JSON オブジェクトにはオブジェクトが " 囲んでいる文字列として含まれていますが、応答全体も文字列であり、内部の " 囲みを \" にします。
しかし、先月、ASP.NET MVC C# の開発者向けの Sabre の適切なチュートリアルの必要性を実感したので、ブログ投稿と他のピア向けの Nuget パッケージを公開します。ライブになったら、リンクを共有します。