Страницы

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

четверг, 19 марта 2020 г.

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

#c_sharp #openlayers #json #http #ajax


Отдается 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 его смог принять?    


Ответы

Ответ 1



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

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

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