RestCode / WebApiProxy

MIT License
199 stars 91 forks source link

Http incorrect Verb generation #115

Open CalinBunea opened 8 years ago

CalinBunea commented 8 years ago

It looks like sometimes the generated Http verb ("GET","POST","DELETE","PUT") is generated based on method name... So if my webservice method name is "DeleteMyStuff" the proxy generated on client will try to use verb "DELETE" although my webservice does not support "DELETE" verb. Same for method named like "GetMyStuff" having [HttpPost] attribute - on client it generates sometimes verb GET instead of verb POST which will result in an error because server does not support GET verb for that method.

faniereynders commented 8 years ago

Hi @CalinBunea the generation is using the API Explorer from within ASP.NET to determine the correct verb and is not per convention directly, however the route resolver in ASP.NET uses convention if the verb is not explicitly defined on the action.

Can you provide me with a snippet of your controller?

CalinBunea commented 8 years ago

Well when I access my webservice /api/proxies for that specific method I have

getPsPopularityDataForSearchPhrases: function(countryPrefix,searchPhrases,options) {
     var defaults = { fields: [] };
     var settings = $.extend({}, defaults, options || {});
     var url = "api/Munin/GetPsPopularityDataForSearchPhrases?countryPrefix=" + countryPrefix;

     if(settings.fields.length > 0) {
        url +=  url.indexOf("?") == -1 ? "?" : "&";
        url += "fields=" + settings.fields.join();
     }

    return invoke.call(this, url, "post", 
                {
                        countryPrefix: countryPrefix,
                    }
                        , searchPhrases);
        },

the method in controller: [HttpPost] public List GetPsPopularityDataForSearchPhrases(string countryPrefix,List searchPhrases) { ...... }

and the generated client proxy public virtual List GetPsPopularityDataForSearchPhrases(String countryPrefix,List searchPhrases) { var result = Task.Run(() => GetPsPopularityDataForSearchPhrasesAsyncMsg(countryPrefix, searchPhrases)).Result;

        EnsureSuccess(result);

        return result.Content.ReadAsAsync<List<PsPopularityData>>().Result;
                }
CalinBunea commented 8 years ago

Small update, I have renamed the method (to not include "get" in name) but still the verb generated is GET...

CalinBunea commented 8 years ago

Another update: I think this issue was caused by a method overload. One of the methods didn't had [HttpPost] and probably this is why the second method (overloaded) which has [HttpPost] was still generated to use verb GET.