Hallo luitjes,
Ben een WebApi aan het maken die JSON en XML kan teruggeven. Lijkt simpel, en dat hoort het naar mijn idee ook te zijn.
Momenteel laat de api gewoon (een lijst met) objecten teruggeven, en de WebApi kijkt dan zelf naar de Accept-header van de request, om te bepalen wat die er van moet maken. Bij XML werkt het allemaal prima, maar JSON geeft toch net wat meer problemen. Er wordt JSON teruggegeven, maar aan het begin wordt een [ en aan het einde wordt een ] toegevoegd aan de JSON-string. Hierdoor gaat het deserializen naar objecten fout. Ik maak gebruik van de Newtonsoft.NET library om te deserializen, met de function JObject.Parse(string). In verband met de [ en ] (een array) dient dit dus met JArray.Parse te gebeuren. Dit is alleen niet gewenst, omdat WebApi voor mijn gevoel heus wel in staat moet zijn om nette correct JSON terug te geven.
Mogelijke oplossingen voor dit probleem:
Voor de beeldvorming nog wat code voorbeelden.
API
Aanroep
Bij de return van ReadStreamFromResponse faalt hij hun dus.
Mocht iemand een mooie oplossing hebben, dan hoor ik het graag!
Ben een WebApi aan het maken die JSON en XML kan teruggeven. Lijkt simpel, en dat hoort het naar mijn idee ook te zijn.
Momenteel laat de api gewoon (een lijst met) objecten teruggeven, en de WebApi kijkt dan zelf naar de Accept-header van de request, om te bepalen wat die er van moet maken. Bij XML werkt het allemaal prima, maar JSON geeft toch net wat meer problemen. Er wordt JSON teruggegeven, maar aan het begin wordt een [ en aan het einde wordt een ] toegevoegd aan de JSON-string. Hierdoor gaat het deserializen naar objecten fout. Ik maak gebruik van de Newtonsoft.NET library om te deserializen, met de function JObject.Parse(string). In verband met de [ en ] (een array) dient dit dus met JArray.Parse te gebeuren. Dit is alleen niet gewenst, omdat WebApi voor mijn gevoel heus wel in staat moet zijn om nette correct JSON terug te geven.
Mogelijke oplossingen voor dit probleem:
- Zelf handmatig met een string replace de [ en ] verwijderen. Niet wenselijk uiteraard, dus geen oplossing
- Schijnt volgens Google: XML formatter uitzetten. Dit heb ik niet uitgeprobeerd, maar is onwenselijk, want de Api moet ook XML kunnen teruggeven
Voor de beeldvorming nog wat code voorbeelden.
API
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| [HttpGet] [CacheOutput(ClientTimeSpan = 30, ServerTimeSpan = 30)] public List<Song> Psalms() { using (ContextService contextService = new ContextService()) { SongService songService = new SongService(contextService); List<Song> songs = songService.Get(SongType.Psalm); return songs; } } |
Aanroep
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| public void CreateRequest(String path, RequestType requestType) { this.httpWebRequest = (HttpWebRequest)WebRequest.Create(Business.Properties.Resources.BaseUrl + path); this.httpWebRequest.ContentType = "application/json"; this.httpWebRequest.Accept = "application/json"; this.httpWebRequest.Method = requestType.GetText(); } public JObject ExecuteRequest() { _ready.Reset(); this.httpWebRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null); _ready.WaitOne(); return this.ReadStreamFromResponse(this.webResponse); } private void FinishWebRequest(IAsyncResult result) { webResponse = this.httpWebRequest.EndGetResponse(result); _ready.Set(); } private JObject ReadStreamFromResponse(WebResponse response) { using (Stream responseStream = response.GetResponseStream()) { using (StreamReader streamReader = new StreamReader(responseStream)) { return JObject.Parse(streamReader.ReadToEnd()); } } } |
Bij de return van ReadStreamFromResponse faalt hij hun dus.
Mocht iemand een mooie oplossing hebben, dan hoor ik het graag!