如何调用odoo原生web api

场景:这几天用C#封装了一下odoo的api,一开始是正常的,但是后来突然间就404错误了,查找了一下原因,原来是只有一个数据库的时候,直接请求api是没问题的,但是多个数据库的情况下就会报404错误,这是因为请求的时候odoo不知道你调用的是哪个数据库,所以就返回报错了。

解决方法如下:

调用登录接口,返回对应的cookie:

private List<RestResponseCookie> Login()

        {

            var client = new RestClient("http://8.142.93.198:8069/web/session/authenticate")

            {

                Timeout = -1

            };

            var request = new RestRequest(Method.POST);

            request.AddHeader("Content-Type", "application/json");

            request.AddHeader("Cookie", "session_id=cfa886f9eaa188cfa58a5a1862b9979416688a29");

            var body = @"{

                            " + "\n" +

                                        @"    ""params"": {

                            " + "\n" +

                                        @"    ""login"": ""admin"", 

                            " + "\n" +

                                        @"    ""password"": ""admin"", 

                            " + "\n" +

                                        @"    ""db"": ""odoo15""

                            " + "\n" +

                                        @"    } 

                            " + "\n" +

                                        @"}";

            request.AddParameter("application/json", body, ParameterType.RequestBody);

            IRestResponse response = client.Execute(request);

            return response.Cookies.ToList();

        }

然后在请求接口的时候,加上登录获取的cookie,代码如下:

private string RestQuest(string method,string param)

        {

            RestClient client = new RestClient(BaseUrl + method + "?" + param)

            {

                Timeout = -1

            };

            var request = new RestRequest(Method.GET);

            IList<RestResponseCookie> cks = Login();

            if (cks.Count > 0)

            {

                if (cks.Where(t => t.Name == "session_id").Count() > 0)

                {

                    request.AddCookie(cks.FirstOrDefault().Name, cks.FirstOrDefault().Value);

                }

            }

            request.AlwaysMultipartFormData = true;

            IRestResponse response = client.Execute(request);

           return response.Content;

        }


这样就完成了一次完整的请求了。