フロントエンドでAngularを使用してフォームからSOMデータを収集し、それをサーバー側コントローラーに送信します。以下の画像に示すように、データ($ scope.newData)を取得します私のコントローラーとサービスで、サーバーに到達すると、次のエラーが表示されます。「サポートされていないメディアタイプ」で、newDataが空です。
私のコントローラー:
// 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);
}
送信しているヘッダーが間違っています。送信しています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 」も参照してください。
これは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 を参照してください。