Используя DotNetNuke DnnApiController, я не могу получить данные поста с помощью команды $ http.post, но .ajax работает - PullRequest
0 голосов
/ 02 сентября 2018

Используя angular, я пытаюсь отправить некоторые почтовые данные в DnnApiController, используя $ http.post:

findit: function(onSuccess, onFailure,searchTerms) {
        alert(JSON.stringify(searchTerms));
        const rvtoken = $("input[name='__RequestVerificationToken']").val();        
        $http({
            cache: false,
            dataType: 'json',
            url: "/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearch",
            method: "Post",
            headers: {
                "ModuleId": moduleId,
                "TabId": tabId,
                "RequestVerificationToken": rvtoken
            },
            data: { "": JSON.stringify(searchTerms) }              
        }).success(onSuccess).error(onFailure);

----. Метод ajax ----

findit: function(onSuccess, onFailure,searchTerms) {
        alert(JSON.stringify(searchTerms));
        const rvtoken = $("input[name='__RequestVerificationToken']").val();
        $.ajax({
        cache: false,
        dataType: 'json',
        url: "/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearch",
        method: "Post",
        headers: {
            "ModuleId": moduleId,
            "TabId": tabId,
            "RequestVerificationToken": rvtoken
        },
        data: { "": JSON.stringify(searchTerms) }
    }).success(onSuccess).error(onFailure);

Обновление 2018/09/02 Я пробовал это:

$http.post("/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearch3",
searchTerms,
{
    headers: {
        "ModuleId": moduleId,
        "TabId": tabId,
        "RequestVerificationToken": rvtoken
    }
}).success(onSuccess).error(onFailure);

Вот мой метод DnnApiController, который вызывается:

[AllowAnonymous]
[DotNetNuke.Web.Api.ValidateAntiForgeryToken]
public string DoAdvancedSearch([FromBody] string advancedSearchItems)
{
    IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
    return JsonConvert.SerializeObject(SearchTerms);
}

или

public string DoAdvancedSearch2([FromBody] IList<SearchTerm> SearchTerms)
        {
            //IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
            return JsonConvert.SerializeObject(SearchTerms);
        }

или

[HttpPost]
        [AllowAnonymous]
        [DotNetNuke.Web.Api.ValidateAntiForgeryToken]
        [Route("doadvancedsearch3")]
        public string DoAdvancedSearch3(IList<SearchTerm> SearchTerms)
        {
            //IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
            return JsonConvert.SerializeObject(SearchTerms);
        }

Все apis запускаются из команды $ http.post в зависимости от того, какой api я вызываю. Но метод $ http.post приводит к нулевому значению параметра API (advancedSearchItems), в то время как метод .ajax работает очень хорошо во всех случаях. Чего мне не хватает в методе $ http?

1 Ответ

0 голосов
/ 07 сентября 2018

Я не уверен, что это даже квалифицируется как ответ, но он работает:

$http(
    {
        url: "/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearchANG",
        data: JSON.stringify(searchTerms),
        method: "post",
        headers: {
            "ModuleId": moduleId,
            "TabId": tabId,
            "RequestVerificationToken": rvtoken,
            'Content-Type': 'application/json'
        }
    }).success(onSuccess).error(onFailure);

или

$http.post("/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearchANG",
    JSON.stringify(searchTerms),
    {
        headers: {
            "ModuleId": moduleId,
            "TabId": tabId,
            "RequestVerificationToken": rvtoken,
            "Content-Type': 'application/json"
        }
    }).success(onSuccess).error(onFailure);

API:

//this method works with AJAX
[HttpPost]
[AllowAnonymous]
[DotNetNuke.Web.Api.ValidateAntiForgeryToken]
public string DoAdvancedSearchAJAX([FromBody] string advancedSearchItems)
{
    IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
    return JsonConvert.SerializeObject(SearchTerms);
}

//This method works with AngularJS $http.post method
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public string DoAdvancedSearchANG(IList<SearchTerm> SearchTerms)
{

    //IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
    return JsonConvert.SerializeObject(SearchTerms);
}

Я думаю, что все, что я пытался ( AngularJs $ http.post () не отправляет данные , например), было для более старой версии Angular, и я делал это более сложным, чем нужно быть.

...