can use API GET but not API POST

老子叫甜甜 提交于 2019-12-05 00:03:50

Skipping right to the update part (everything else is not relevant as I understand). Options should look like this:

var post_options = {
    host: 'actualUrlAddress',
    protocol: 'https:'
    port: '443',
    path: '/api/SyncPersonnelViaAwsApi/SapEaiCall',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': post_data.length
    }
};

Since as documentation states, host and protocol are in two separate properties, and SSL port is very unlikely to be 80, usually it is 443.

Given that Web API is being used the assumption is that the default routeing has also been configured.

I would suggest enabling attribute routing

Reference Attribute Routing in ASP.NET Web API 2

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

and updating the controller with the appropriate attributes and syntax

[RoutePrefix("api/SyncPersonnelViaAwsApi")]
public class SyncPersonnelViaAwsApiController : ApiController {

    //GET api/SyncPersonnelViaAwsApi/4
    [HttpGet]
    [Route("{id:int}")]
    public IHttpActionResult Get(int id) {
        return Ok("value");
    }

    //POST api/SyncPersonnelViaAwsApi
    [HttpPost]
    [Route("")]
    public IHttpActionResult SapCall([FromBody]string xmlFile) {
        string responseMsg = "Failed Import User";

        if (!IsNewestVersionOfXMLFile(xmlFile)) {
            responseMsg = "Not latest version of file, update not performed";
        } else {
            Business.PersonnelReplicate personnelReplicate = BusinessLogic.SynchronisePersonnel.BuildFromDataContractXml<Business.PersonnelReplicate>(xmlFile);
            bool result = Service.Personnel.SynchroniseCache(personnelReplicate);
            if (result) {
                responseMsg = "Success Import Sap Cache User";
            }
        }

        var data = new { 
            response = responseMsg,
            isNewActiveDirectoryUser = false
        };

        Ok(data);
    }
}

Take note of the expected paths in the comments above the actions.

The [Http{Verb}] attributes tell the routing framework what requests can be mapped to the action.

now from the client the paths to call would be

GET api/SyncPersonnelViaAwsApi/4
POST api/SyncPersonnelViaAwsApi

As already mentioned in the comments, the port 80 is not used for HTTP calls. Even the linked example in the updated question uses port 443 for HTTPS calls. The header in options show JSON yet the body infers that XML is being sent.

var post_options = {
    host: 'actualUrlAddress',
    protocol: 'https',
    port: '443',
    path: '/api/SyncPersonnelViaAwsApi',
    method: 'POST',
    headers: {
        'Content-Type': 'application/xml',
        'Content-Length': post_data.length
    }
};

In order for the client to successfully communicate with the Web API the client will need to make sure it is making a valid request.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!