web-dev-qa-db-ja.com

サポートされていないメディアタイプASP.NET Core Web API

フロントエンドでAngularを使用してフォームからSOMデータを収集し、それをサーバー側コントローラーに送信します。以下の画像に示すように、データ($ scope.newData)を取得します私のコントローラーとサービスで、サーバーに到達すると、次のエラーが表示されます。「サポートされていないメディアタイプ」で、newDataが空です。

Website console

私のコントローラー:

// Create new salesman
  $scope.addSalesman = function (newData) {
    console.log("Controller");
    console.log($scope.newData);
    myService.addNewSalesman($scope.newData).then(function (data) {
      console.log(data);
    }, function (err) {
      console.log(err);
    });
  };

私のサービス:

addNewSalesman: function (newData) {
            console.log("service");
            console.log(newData)
            var deferred = $q.defer();
            $http({
                method: 'POST',
                url: '/api/Salesman',
                headers: { 'Content-type': 'application/json' }
            }, newData).then(function (res) {
                deferred.resolve(res.data);
            }, function (res) {
                deferred.reject(res);
            });
            return deferred.promise;
        }

私のセールスマンモデル:

public class Salesman
    {
        public int SalesmanID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Gender { get; set; }
        public string BirthDate { get; set; }
        public int Phone { get; set; }
        public string Adress { get; set; }
        public string City { get; set; }
        public int Postal { get; set; }
        public string Role { get; set; }
    }

私のサーバー側コントローラー:

[Route("api/[controller]")]
public class SalesmanController : Controller
{

    private readonly DataAccess _DataAccess;

    public SalesmanController() 
    { 
        _DataAccess = new DataAccess(); 
    } 

    [HttpPost]
    public IActionResult PostSalesman([FromBody] Salesman newData)
    {
        return Ok(newData); 
    }
7
Fillah

送信しているヘッダーが間違っています。送信していますContent-Type: application/json、しかしあなたはAccept: application/json

Content-Type: application/jsonは、サーバーがクライアントに送信する必要があるものであり、クライアントはAcceptを送信して、サーバーが受け入れる応答のタイプを伝える必要があります。

addNewSalesman: function (newData) {
        console.log("service");
        console.log(newData)
        var deferred = $q.defer();
        $http({
            method: 'POST',
            url: '/api/Salesman',
            headers: { 'Accept': 'application/json' }
        }, newData).then(function (res) {
            deferred.resolve(res.data);
        }, function (res) {
            deferred.reject(res);
        });
        return deferred.promise;
    }

それを行う必要があります。 MDNの「 Content negotiation 」も参照してください。

6
Tseng

これはCORSの問題です。

開発中は、すべてのオリジンからのすべてのhttp要求メソッドを受け入れても安全です。 startup.csに次を追加します。

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        //Accept All HTTP Request Methods from all origins
        app.UseCors(builder =>
            builder.AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod());

        app.UseMvc();
    }

CORSの詳細については、 here を参照してください。

6
Snir Yarom