415错误来自Angular的网络Api POST

时间:2015-11-04 23:33:08

标签: angularjs post asp.net-web-api

花费数小时与简单的POST请求对抗Web API控制器。



Here's the response header from Postman:
Access-Control-Allow-Headers → Content-Type
Access-Control-Allow-Methods → GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin → *
Cache-Control → no-cache
Content-Length → 2153
Content-Type → application/json; charset=utf-8
Date → Wed, 04 Nov 2015 23:26:14 GMT
Expires → -1
Pragma → no-cache
Server → Microsoft-IIS/10.0
X-AspNet-Version → 4.0.30319
X-Powered-By → ASP.NET
X-SourceFiles → =?UTF-8?B?QzpcVXNlcnNcSnVsaWFcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xUd2lsZHlcQVBJXGFwaVxUZXN0XHRlc3Rc?=




我尝试了这两种POST方法都没有成功:

  1. 
    
            [Route("api/{Test}/test")]
            [HttpPost]
            public void PostByProducts(Test t)
            {
                Console.Write(t.Name);
            }
    
    
    

  2. 更新:下面的代码替换为最终有效的代码。注意,我添加了Name =" PostData"这是Controller的名称。否则,得到" null reference"错误。 "数据数据"本身就是模特中的一个类。

  3. 
    
        [ResponseType(typeof(Data))]
        [Route("api/{Test}/testpost/", Name="PostData")]
        public IHttpActionResult PostData(Data data)
        {
            int rValue = 0;
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            else
            {
                if (data != null)
                {
                    rValue = repo.PostTestMe(data);
                }
                else
                {
                    return BadRequest();
                }
            }
    
            return CreatedAtRoute("PostData", rValue, data);
        }
    
    
    

    #1我的班级"测试"无论请求内容类型如何,始终以null为单位。我在Postman中尝试了所有这些,包括json。阅读一些SO答案,我确实在模型类中添加了一个空构造函数(" Test")

    在#2上(旧:从角度发布时我得到空值)现在也使用更新的代码发布角度。当我从邮递员发帖时工作。

    我在我的智慧结束。我想要做的就是从Angular发布一个简单的表单。

    更新:现在它适用于Postman。我在函数中得到一个非null值,并在Postman中得到这个响应:

    
    
    Access-Control-Allow-Headers → Content-Type
    Access-Control-Allow-Methods → GET, POST, PUT, DELETE, OPTIONS
    Access-Control-Allow-Origin → *
    Cache-Control → no-cache
    Content-Length → 1308
    Content-Type → application/json; charset=utf-8
    Date → Thu, 05 Nov 2015 03:15:26 GMT
    Expires → -1
    Pragma → no-cache
    Server → Microsoft-IIS/10.0
    X-AspNet-Version → 4.0.30319
    X-Powered-By → ASP.NET
    X-SourceFiles → =?UTF-8?B?QzpcVXNlcnNcSnVsaWFcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xUd2lsZHlcQVBJXGFwaVx0ZXN0cG9zdA==?=
    
    
    

    这是我在Postman发送的内容: enter image description here

    Angular code :( formdata直接来自html表单,使用form.Field1,form.Field2等引用,对应于C#模型类)

    
    
            factory.postForm = function(formdata) {
              return $http({
                url: 'http://domain.com/api/test/testpost',
                data: JSON.stringify(formdata),
                method: 'POST',
                headers: {
                  'Content-Type': 'application/json; charset=utf-8'
                }
              }).success(function(response) {
                console.log('posted ' + formdata)
              });
            }
    
    
    

    (旧:仍然在API post函数中获取null。)一切正常。

    最终更新:

    平心而论,当我将源代码上传到共享主机上的实时服务器,并且API托管在同一个域下,只是一个不同的项目时,一切正常,我获得了201 Created OK响应。

    所以,这是一个CORS问题,我想,这很有意思,因为一切在本地主机上可以正常用于GET请求,但是POST给了我很多困难。

    顺便说一下,我最终没有使用[FromBody] - 它没有使用它。

    更新:结束为路线添加名称。一切正常。

2 个答案:

答案 0 :(得分:0)

我之前遇到过类似的问题,在我的情况下,在类参数解决问题之前添加[FromBody]。

在您的情况下,测试方法必须如下所示。

[HttpPost]
public IHttpActionResult PostTest([FromBody]Test test)
{
}

可以找到FromUri和FromBody的详细说明here

答案 1 :(得分:0)

我已经花了数小时在stackoverflow和google中四处寻找解决方案,这是我为解决该问题所做的事情

在Angular中使用HttpClientModule时,无需调用JSON.stringify(formdata),因为data参数根据需要进行了字符串化

@Injectable()
export class ParkingService {
  constructor(private http: HttpClient) { }

  create(parking: Parking) {
    const requestUrl = environment.apiUrl + 'parking' ;
    const headerOptions = new HttpHeaders();

    headerOptions.set('Content-Type', 'application/json');

    //In this line is my issue
    return this.http.post(requestUrl, JSON.stringify(parking), {headers: headerOptions}) ; 
  }
}

我将这一行更改为此行,并且该行有效了(假设它是由邮递员提供的)

return this.http.post(requestUrl, parking, {headers: headerOptions}) ;

如果您的角度客户端使用其他端口/机器上的Web API,则需要在该API中启用CORS。对于.Net Core,如果它的某些其他编程语言以相同的方式查找它,这里是一些很好的答案How to enable CORS in ASP.net Core WebAPI