くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

WebApi

.net MVC WebApi のContent-Type

.net MVCでWebApi作ってたんですが、なんだか戻りがXMLになってしまう。Jsonで返したい。

とりあえず、Chromeで取るとデフォでXMLになるっぽい?デフォでJsonにしたい。

stackoverflowに同じ質問あった。さすが。。。

回答は色々あるけど、何となく今は↓が一番良さげ?デフォを変えるなら。

using System.Net.Http.Formatting;//RequestHeaderMapping用

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        //デフォルトのフォーマットを変える↓
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new RequestHeaderMapping("Accept",
                          "text/html",
                          StringComparison.InvariantCultureIgnoreCase,
                          true,
                          "application/json"));
    }
}

WebApiConfigのRegisterの中で↑を追記。

あと、ちょっと違うけど、URLの指定で最後に「~~.json」とか「~~.xml」って指定させて、フォーマットを変える方法。RedmineのAPIはこれ形式すな。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API ルート
        config.MapHttpAttributeRoutes();
        config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json");
        config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "application/xml");
        
        //ルートの設定で{ext}が必要
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}.{ext}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

ただ、最初のデフォルト強制する奴つけてると効かなくナリ。

あと、↓の感じでURLは最後の「/」付けないと効かなかったりする。ちょっとハマッた。Routeの設定ちゃんとやればいけるっぽいの。

/api/controller/action.json/

ついでに、Routeの設定ってみんなどうしてるんでしょ。デフォのままだと、Controllerのみだから、GetとかPostしか作れないよね?

Controller増やせばいいんだけど、ファイルいっぱいできるからあまし好きじゃない。なので、action入れてやってたりするんですが、これってありなのかしら。イマイチ分かってない。

.net mvc WebApiにレスポンスヘッダつける

以前、レスポンスヘッダ付けるやつを書いた。あっちはControllerを継承した普通のページ用のコントローラでの話。WebApiでやる場合はちょっと変えないと無理。↓の感じ。

public class WebApiController : ApiController
{
  public HttpResponseMessage Get()
  {
      var hogeModel = somethingModel();
      var response = Request.CreateResponse(HttpStatusCode.OK, hogeModel);
      response.Headers.Add("Access-Control-Allow-Origin", "*");//レスポンスヘッダ付ける
      return response;
  }
}

Jsonで戻したい場合は、オブジェクトで戻すと思うんだけど、↑の感じで書いてあげるとオブジェクトをJsonにして戻してくれる。

問合せ