Sur le front-end, j'utilise Angular pour collecter certaines données du formulaire et les envoyer à mes contrôleurs côté serveur. Comme le montre l'image ci-dessous, j'obtiens les données ($ scope.newData) sur mon contrôleur et service, mais quand il atteint le serveur, j'obtiens l'erreur suivante: "Type de support non pris en charge" et mon newData est vide.
Mon contrôleur:
// 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);
});
};
Mon service:
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;
}
Mon modèle de vendeur:
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; }
}
Mon contrôleur côté serveur:
[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);
}
L'en-tête que vous envoyez est incorrect. Vous envoyez Content-Type: application/json
, mais vous devez envoyer Accept: application/json
.
Content-Type: application/json
est ce que le serveur doit envoyer au client et le client doit envoyer Accept
pour indiquer au serveur le type de réponse qu'il accepte.
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;
}
Devrait le faire. Voir aussi " Content négociation " sur MDN.
Il s'agit d'un problème CORS.
Pendant le développement, il est sûr d'accepter toutes les méthodes de demande http de toutes origines. Ajoutez ce qui suit à votre 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();
}
Voir ici pour plus de détails sur CORS.