Возврат либо xml, либо json из MVC веб-API на основе запроса возвращает ошибку 404 - PullRequest
0 голосов
/ 03 мая 2020

Используя URL http://localhost/api/Student, я получаю список студентов в формате XML.

Что я хотел бы сделать, так это иметь возможность вернуть либо json, либо xml на основе запрос. Таким образом, для json это будет;

http://localhost/api/Student.json

, а для XML это будет;

http://localhost/api/Student.xml

аналогично;

http://localhost/api/Student.json/1/
http://localhost/api/Student.xml/1/

I Я реализовал это в моем WebApiConfig.cs файле.

 StructuremapWebApi.Start();


 config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json");
 config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml");
 // Web API routes
 config.MapHttpAttributeRoutes();

 config.Routes.MapHttpRoute(
 name: "DefaultApi",
 routeTemplate: "api/{controller}/{id}",
 defaults: new { id = RouteParameter.Optional }
 );

 config.Routes.MapHttpRoute(
 name: "Api UriPathExtension ID",
 routeTemplate: "api/{controller}/{id}.{ext}",
 defaults: new { id = RouteParameter.Optional, extension = 
 RouteParameter.Optional }
 );

 config.Routes.MapHttpRoute(
 name: "Api UriPathExtension",
 routeTemplate: "api/{controller}.{extension}/{id}",
 defaults: new { id = RouteParameter.Optional, extension = 
 RouteParameter.Optional }
 );

Как только я вызываю одну из ссылок с расширением, она возвращает HTTP Error 404.0 - Not Found.

Я что-то упустил? Любая помощь, пожалуйста.

1 Ответ

0 голосов
/ 03 мая 2020

Я не разработчик do tnet, но я думаю, что AddUriPathExtensionMapping не делает то, что вы думаете, он делает. Я предполагаю, что ваши маршруты не регистрируются с типами файлов .json или .xml, как вы думаете, поэтому вы получаете 404.

Так что вам придется либо выяснить, как добавить для сопоставления с образцом вам нужен правильный путь или другой подход.

Обычно API поддерживает несколько форматов через HTTP-заголовки.

Для JSON клиент отправляет заголовки:

Content-Type: application/json
Accepts: application/json

Для XML, обычно это:

Content-Type: application/json
Accepts: application/xml

Предполагая, что вы все еще хотите отправить тело JSON в ваш API при отправке POST, PUT или PATCH, но просто ожидаете получить ответ в формате XML. Если вы хотите отправить через XML, то измените Content-Type на application/xml

Конечно, вы должны сами поддерживать эти заголовки на стороне сервера, обычно добавляя промежуточное ПО, которое сериализует ответы и запросы в и из нужного вам формата.

...