在Youtube API中,有權請求"partial feed"。如何使用ServiceStack實現部分請求和響應,如youtube api?
這允許應用程序開發人員通過指定要返回的「字段」來調整返回數據的大小和結構。
即GET api/person/1?fields=(id,email)
將返回僅包含id
和email
字段的DTO,而不是整個人的響應。
您將如何使用ServiceStack嘗試此操作?有什麼方法可以將回調附加到serialiser以控制哪些屬性包含在響應對象中?
在Youtube API中,有權請求"partial feed"。如何使用ServiceStack實現部分請求和響應,如youtube api?
這允許應用程序開發人員通過指定要返回的「字段」來調整返回數據的大小和結構。
即GET api/person/1?fields=(id,email)
將返回僅包含id
和email
字段的DTO,而不是整個人的響應。
您將如何使用ServiceStack嘗試此操作?有什麼方法可以將回調附加到serialiser以控制哪些屬性包含在響應對象中?
從我的經驗來看,servicestack只返回實際上有數據的字段。如果我的經驗是正確的,那麼你所需要做的就是找出設計請求的最佳方式,以便它要求返回特定數據,這樣你只需要填充請求數據的響應,因此servicestack只會返回。
看看ServiceStack.Text.JsConfig屬性,它們具有所有ServiceStack的文本序列化器支持的鉤子和自定義。具體來說,使您可以自定義解串鉤:
JsConfig<T>.DeserializeFn
JsConfig<T>.RawDeSerializeFn
JsConfig<T>.OnDeserializedFn
我想定製序列化,而不是反序列化。我查看了JsConfig屬性,並且ExcludePropertyNames與我所需要的最接近,但我不想在Type級別定義它,而是在每個請求的基礎上定義它。 – jmc
我們能夠實現表示通過添加自定義服務和亞軍使用它的一些反射構造ExpandoObject
與響應DTO設置必填字段篩選。請參閱this瞭解更多關於服務參加者的信息。
我爲只返回JSON的API實現了這個功能。
首先我創建了兩個結構,以(反)序列化和解讀「場」的查詢參數遞歸語法:
FieldSelector
,其指定一個字段和可能它的子FieldSelection
括號之間封閉;FieldsSelection
,這是一個逗號分隔的列表FieldSelector
。我已經使用了structs而不是類,因爲AFAIK不能覆蓋ServiceStack中URL的類(de)序列化。使用結構體可以通過覆蓋ToString
(序列化程序)並提供接受字符串作爲參數的構造函數(反序列化程序)來實現。
那你這包括在返回JSON每個請求DTO:ServiceRunner<T>.OnAfterExecute
您序列化的響應DTO以JSON
FieldsSelection Fields { get; set; }
上的自定義,與ServiceStack.Text的JsonObject
分析它,並用遞歸應用領域選擇方法是這樣的:
private static JsonObject Apply(this JsonObject json, FieldsSelection fieldMask)
{
IEnumerable<string> keysToRemove = json.Keys.ToList().Except(fieldMask.Keys);
foreach (var key in keysToRemove)
json.Remove(key);
foreach (var selector in fieldMask.Selectors.Values.Where(s => s.HasSubFieldsSelection))
{
var field = json[selector.Field];
if (field == null)
continue;
switch (field[0])
{
case '{':
json[selector.Field] = Apply(json.Object(selector.Field), selector.SubFieldsSelection).ToJson();
break;
case '[':
var itensArray = json.ArrayObjects(selector.Field);
for (int i = 0; i < itensArray.Count; i++)
itensArray[i] = Apply(itensArray[i], selector.SubFieldsSelection);
json[selector.Field] = itensArray.ToJson();
break;
default:
throw new ArgumentException("Selection incompatible with object structure");
}
}
return json;
}
然後您返回結果作爲您的答覆DTO。我也實現了負字段選擇器(fields=-foo
選擇除foo以外的所有DTO字段),但您明白了。
我確實考慮過這種方法,它可能是唯一可行的方法。看起來像雙重處理走屬性樹設置您不想返回到空字段,因爲序列化程序將再次步行屬性樹以輸出JSON響應。 – jmc
有一個配置屬性來控制是否返回空值。 'JsConfig.IncludeNullValues' – jmc
不幸的是,這對於值類型的DTO成員不起作用。 – starteleport