Angular 5 Post API 调用

Posted

技术标签:

【中文标题】Angular 5 Post API 调用【英文标题】:Angular 5 Post API Call 【发布时间】:2018-04-06 05:24:23 【问题描述】:

我对 Angular 很陌生,在 Angular 5 中开发应用程序。我正在尝试将一些数据发布到 API,下面是我的代码

.Net Core Web API

    [Produces("application/json")]
    [Route("api/Audit")]
         public class AuditController : Controller
        
            private IConfiguration _configuration;
            private CommomUtility util;
            private Login Login;

            public AuditController(IConfiguration configuration)
            
                _configuration = configuration;
                util = new CommomUtility(configuration);
                Login = new Login(configuration);
            

            [HttpPost]
            public JsonResult Action([FromBody] List<Dictionary<string, string>> li)
            
                DataTable dt = new DataTable();
                string jsonString = string.Empty;
                try
                
                    if (li[0]["ActionMethod"].Equals("CheckLogin", StringComparison.InvariantCultureIgnoreCase))
                    
                        dt = Login.checkLogin(li);
                    
                
                catch (Exception ex)
                
                
                finally
                
                    dt.TableName = "Result";
                    jsonString = util.DataTableToJson(dt);
                
                return Json(JObject.Parse(jsonString));
           
        

Angular 登录组件

    import  Component, OnInit  from '@angular/core';
import  HttpClient,HttpClientModule,HttpParams,HttpHeaders  from '@angular/common/http';

@Component(
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
)
export class LoginComponent implements OnInit 
  username: string="";
  password: string="";
  loginBtnText: string='Log In';
  clearBtnText: string='Reset Fields';
  message:string;
  cssClass:string;

  constructor(private http:HttpClient  )  

  ngOnInit() 
  

  checkLogIn()
    const params = new HttpParams();
    params.set('ActionMethod', 'CheckLogin');
    params.set('StaffCode', '15989');
    params.set('Password', '#####');
    var queryHeaders = new HttpHeaders();
    queryHeaders.append('Content-Type', 'application/json');
   debugger
    var v= this.http.post("http://localhost:57863/api/Audit/",
      params, headers: queryHeaders
    )
    .subscribe(data => 
    alert('ok');,
     error => 
     alert("Error");
    );
  

  clearFields()
    this.username="";
    this.password="";
    this.message="";
  


我在按钮单击时调用 checkLogIn(),在调用此 API 后,它只到达 API 类的构造函数,但不进入 API 方法。

我检查了我的浏览器网络选项卡,它显示了

415 不支持的媒体类型

当我调用 Get API (values api) 时,它默认出现在 .Net Core Web API 模板中,它可以正常工作并显示警报 OK,但在 POST 的情况下失败

更新 1

【问题讨论】:

可以分享一下json示例吗? @SuvethanNantha,什么 json? 请求POST的json 检查 HttpParams 部分 好的,给我几分钟 【参考方案1】:

似乎您在 Web API 中将 application/json 提到为 Produces("application/json"),但没有在 Angular 代码的标头中传递它。

试试这个

import  HttpClient, HttpHeaders,HttpParams from '@angular/common/http';

如果无法更改 web api,则如下所示更改 angular 代码并保持 web api 不变。

角度

checkLogIn()
    var requestData=[];

    var params=
      "ActionMethod":"CheckLogin",
      "StaffCode":"15989",
      "Password":"####"
    
    requestData.push(params);

    const httpOptions = 
          headers: new HttpHeaders(
            'Content-Type':  'application/json'
          )
        ;

    //pass it if you can't modify web api
    var v= this.http.post("http://localhost:5000/api/Audit/",
      requestData,httpOptions
    )
    .subscribe(data => 
    alert('ok');,
     error => 
     alert("Error");
    );


如果你可以更改 web api 那么,

角度

checkLogIn()
    var requestData=[];

    var params=
      "ActionMethod":"CheckLogin",
      "StaffCode":"15989",
      "Password":"####"
    


    const httpOptions = 
          headers: new HttpHeaders(
            'Content-Type':  'application/json'
          )
        ;

   //pass it like this if you can change web api
    var v= this.http.post("http://localhost:5000/api/Audit/",
      params,httpOptions
    )
    .subscribe(data => 
    alert('ok');,
     error => 
     alert("Error");
    );

网络 API 控制器

public class LoginContract

    public string ActionMethod  get; set; 
    public string StaffCode  get; set; 
    public string Password  get; set; 


[HttpPost]
public JsonResult Action([FromBody] LoginContract li)

    DataTable dt = new DataTable();
    string jsonString = string.Empty;
    try
    
        if (li.ActionMethod.Equals("CheckLogin", StringComparison.InvariantCultureIgnoreCase))
        
            dt = Login.checkLogin(li);
        
    
    catch (Exception ex)
    
        Console.Write(ex);
    
    finally
    
        dt.TableName = "Result";
        jsonString = util.DataTableToJson(dt);
    
    return Json(JObject.Parse(jsonString));

我认为您尚未在 Web api 中启用 Cors 模块。将以下代码添加到您的 Web api 的 Startup.cs。

如果你还没有安装 CORS nuget 包

Install-Package Microsoft.AspNetCore.Cors

ConfigureServices 方法中添加代码。

services.AddCors(options =>
            
                options.AddPolicy("AllowAll",
                    builder =>
                    
                        builder
                        .AllowAnyOrigin() 
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .AllowCredentials();
                    );
            );

现在在 Configure 方法中在 app.UseMvc() 之前添加以下代码。

app.UseCors("AllowAll");

我希望这能解决您的问题。如果您有任何问题或疑问,请告诉我。

【讨论】:

现在它说 404 Not Found 。它应该将 Content Type 设置为 json 但在标题中它只显示 'Access-Control-Request-Headers: content-type' 和 'Request Method: OPTIONS' 而不是 POST @Jack 我已经检查过它对我有用吗?可以有错误,但不能是404。可以附上截图吗? ,检查更新 1 ,我已经发布了两个截图 @Jack 检查更新的答案,你得到的错误是因为 cors 没有启用 ,它可以工作,点击 api 但参数为空,仍然有东西阻止参数设置【参考方案2】:

错误415 Unsupported media type 说请求标头content-type 的值不是服务器在请求中期望的值。尝试将 content-type 标头设置为 Angular 中的 application/json 值。

【讨论】:

我确实添加了 Content Type ,检查我更新的帖子,但在网络选项卡中它仍然显示 Content-Type: application/x-www-form-urlencoded;charset=UTF-8 但是您没有在请求中传递 json 对象。直接在请求中传递 json payload。 @Jack 在 ajax 世界中这是一个非常普遍的问题。在互联网上搜索有关此的内容。要解决这个问题,您的服务器应该返回缺少的标头以及您的 Angular 应用程序的主机名,或者如果您的 Angular 应用程序部署在同一台服务器上,请在 ajax 调用中使用相对路径。【参考方案3】:

内容类型似乎是错误的。您可以尝试直接发送 JSON 对象作为有效负载。 `

const payload = 
'ActionMethod': 'CheckLogin',
'StaffCode': '15989',
'Password': 'a$a#'

var v= this.http.post("http://localhost:57863/api/Audit/",payload)`

【讨论】:

【参考方案4】:

您正面临 COARS 错误问题,非常有名 当您调用另一个进程链接命中时,请不要惊慌 做

webapiconfig.cs

  var cors = new System.Web.Http.Cors.EnableCorsAttribute("http://localhost:51156", 
  "*", "*");

        config.EnableCors(cors);

        // ADD JUST THIS LINE TO REGISTER FOLLOWING CLASS.
        config.Formatters.Add(new BrowserJsonFormatter());

现在将以下代码添加到 ovverride

// TO SEE DATA IN JSON IN CHROME BROWSER ADD FOLLOWING CLASS BrowserJsonFormatter and REGISTER IN METHOD ADD NEW OBJECT OF THIS CLASS.
public class BrowserJsonFormatter : System.Net.Http.Formatting.JsonMediaTypeFormatter

    public BrowserJsonFormatter()
    
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        this.SerializerSettings.Formatting = Formatting.Indented;
    

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
    
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    


//-----------------------------------------------------------------------------------------------------------------------

【讨论】:

以上是关于Angular 5 Post API 调用的主要内容,如果未能解决你的问题,请参考以下文章

从 Angular 9 调用 AWS api 给出 cors 错误

Angular 4 和 Laravel 5.4 的刷新路由问题

api调用获取失败,CORS,nginx已配置

如何使用 ANGULAR 5 的 ARC 扩展发送 POST 请求以测试 api Rest?

Angular 中应该使用哪个函数来处理 api post 请求?

升级 Angular 版本 5