Страницы

Поиск по вопросам

четверг, 6 июня 2019 г.

Как послать JSON в теле HTTP-ответа?

Отдается JSON так: HttpListener listener = new HttpListener(); listener.Prefixes.Add(new Uri("http://localhost:8181")); listener.Start(); while (isListening) { HttpListenerContext context = listener.GetContext(); HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; //... MemoryStream ms = (GeoJsonDeserialize.SerializeGeoJson(ObjToJson) as MemoryStream); byte[] buffer = ms.ToArray(); response.StatusCode = (int)HttpStatusCode.OK; response.KeepAlive = false; response.ContentType = "application/json"; response.ContentEncoding = System.Text.UTF8Encoding.UTF8; response.ContentLength64 = buffer.Length; response.AddHeader("Cache-Control", "private, max-age=0"); Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); ms = new MemoryStream(); ms.Write(buffer, 0, buffer.Length); buffer = ms.ToArray(); output.Close(); } В другой проге на C# я запрашиваю так: WebRequest webRequest = WebRequest.Create("http://localhost:8181"); WebResponse webResponse = webRequest.GetResponse(); StreamReader sr = new StreamReader(webResponse.GetResponseStream()); String str = sr.ReadToEnd(); и вижу переданный текст (JSON). Но вот беда - ни Ajax не видит тело ответа (выдает ошибку), ни OpenLayers который по GeoJSON должен показать точки на карте. OpenLayers запрашивает данные (за основу взят пример OpenLayersRotationExample): vectors = new OpenLayers.Layer.Vector( "Simple Geometry", { protocol: new OpenLayers.Protocol.HTTP({ url: "http://localhost:8181", format: new OpenLayers.Format.GeoJSON() }), strategies: [new OpenLayers.Strategy.Fixed()] }); map.addLayers([vectors]); Объект в JSON (GeoJSON) выглядит так: {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-108.04,44.68]},"properties":{"course":184.7}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":44.1}}]} Специально пробовал текст передаваемого JSON загрузить в OL непосредственно в JavaScript: var featurecollection = {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":42.9}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":157.5}}]}; var geojson_format = new OpenLayers.Format.GeoJSON(); var vector_layer = new OpenLayers.Layer.Vector("Simple 1", { styleMap: new OpenLayers.StyleMap({ "default": { externalGraphic: "OpenLayersRotationExample_files/marker-gold.png", //graphicWidth: 17, graphicHeight: 20, graphicYOffset: -19, rotation: "${course}", }, "select": { cursor: "crosshair", externalGraphic: "OpenLayersRotationExample_files/marker.png" } }) }); map.addLayer(vector_layer); vector_layer.addFeatures(geojson_format.read(featurecollection)); И все работает - точки отображаются. Вывод - я неправильно отдаю JSON. Подскажите как в ответ на запрос отдать JSON что бы JavaScript его смог принять?


Ответ

Поскольку провайдер точек и страница отображающая карту находится в разных доменах, действует Same Orign Policy В OpenLayers есть OpenLayers.Protocol.Script который использует JSONP для получения данных. По умолчанию callback называется OpenLayers.Protocol.Script.registry.c1. Вам необходимо переделать провайдер соответствующим образом, чтобы он оборачивал результирующий JSON в эту функцию.

Комментариев нет:

Отправить комментарий