ブラウザからサービスにアクセスしたときに通常返される HTML 形式の応答とは対照的に、ServiceStack のデフォルト形式を JSON に設定したいと考えています。これは、?format=json パラメータを送信するか、Accept ヘッダーを application/json に設定することで、リクエストごとに指定できることを知っています。リクエストからのこれらのヒントに頼らずにこれを変更する方法はありますか?
3 に答える
?format=jsonを使用して QueryString で指定することに加えて、フォーマット .extをルートの最後に追加するか (例: /rockstars.json )、または HTTP ヘッダー (HttpClient 内) を指定しますAccept: application/json
。
それ以外の場合、HttpClient が Accept ヘッダーを送信しない場合は、AppHost で JSON をデフォルトのコンテンツ タイプとして指定できます。
SetConfig(new HostConfig {
DefaultContentType = MimeTypes.Json
});
ServiceStack のすべての構成オプションはここで設定されます。
Web ブラウザーから Web サービスを呼び出すときの問題は、通常、Accept: text/html
JSON ではなく JSON を要求することです。JSON は、契約により、ServiceStack が有効になっている場合は HTML を返すことを義務付けています。
JSON が確実に返されるようにするには、次の方法で HTML 機能を無効にすることもできます。
SetConfig(new HostConfig {
EnableFeatures = Feature.All.Remove(Feature.Html),
});
応答コンテンツ タイプを指定するさまざまな方法
それ以外の場合は、Accept ヘッダーをオーバーライドする場合は、HTTP 応答をカスタマイズするこれらの方法のいずれかを使用して、サービスが常に json を返すように強制できます。
フィルターの使用 (AddHeader は組み込み):
[AddHeader(ContentType=MimeTypes.Json)]
public object Any(Request request) { ... }
サービスでのレスポンスの設定:
public object Any(Request request)
{
base.Response.ContentType = MimeTypes.Json;
return dto;
}
装飾された応答を返す:
return new HttpResult(dto, MimeTypes.Json);
PreRequestFilter を使用して、JSON 応答をブラウザーに強制します。クエリ文字列に ?format=json がまだ表示されますが、html と xml を無効にしている場合に便利です。
this.PreRequestFilters.Add( (req, res) =>
{
const string queryString = "format=json";
var jsonAccepted = req.AcceptTypes.Any(t => t.Equals(ContentType.Json, StringComparison.InvariantCultureIgnoreCase));
var jsonSpecifiedOnQuerystring = !string.IsNullOrEmpty(req.QueryString["format"]) && req.QueryString["format"].Equals("json", StringComparison.InvariantCultureIgnoreCase);
if (!jsonAccepted && !jsonSpecifiedOnQuerystring)
{
var sb = new StringBuilder(req.AbsoluteUri);
sb.Append(req.AbsoluteUri.Contains("?") ? "&" : "?");
sb.Append(queryString);
res.RedirectToUrl(sb.ToString(), HttpStatusCode.SeeOther);
res.Close();
}
});
質問に遅れましたが、答えがどこにも見つからなかったので、ServiceStackのソースコードからようやくわかりました:)
ブラウザから Html ではなく Json をデフォルトにする最も簡単な方法は次のとおりです。
HttpRequestExtensions.PreferredContentTypes = new[] { MimeTypes.Json, MimeTypes.Xml };
アプリの起動時にこれを呼び出すと、デフォルトの ServiceStack MIME タイプがオーバーライドされ、json で始まります ( /が一致するため、ブラウザーの要求で動作します)。
Html を無効にして、Json をデフォルトの MIME タイプにする必要があることに注意してください。
SetConfig(new HostConfig {
DefaultContentType = MimeTypes.Json
EnableFeatures = Feature.All.Remove(Feature.Html),
});
興味深いことに、 ServiceStack は内部的に使用しHttpRequestExtensions.GetResponseContentType
(「参考文献」を参照HttpRequestExtensions.cs
)、優先コンテンツ タイプをループします。が含まれているためMimeTypes.Html
、ブラウザーからの最初の受け入れタイプ ( text/html
) をキャッチし、その後に来るものはすべて無視します。これをオーバーライドすることでtext/html
、優先コンテンツ タイプとは見なされず、期待どおり*/*
にデフォルトでスキップjson
されます。