AngularJS передає дані до $ http.get запиту


577

У мене є функція, яка робить http POST-запит. Код вказано нижче. Це чудово працює.

 $http({
   url: user.update_path, 
   method: "POST",
   data: {user_id: user.id, draft: true}
 });

У мене є ще одна функція для http GET, і я хочу надіслати дані на цей запит. Але я не маю такої можливості отримати.

 $http({
   url: user.details_path, 
   method: "GET",
   data: {user_id: user.id}
 });

Синтаксис для http.getє

get (URL, конфігурація)

Відповіді:


942

Запит HTTP GET не може містити даних, які слід розмістити на сервері. Однак ви можете додати рядок запиту до запиту.

angular.http надає опцію для цього, що називається params.

$http({
    url: user.details_path, 
    method: "GET",
    params: {user_id: user.id}
 });

Дивіться: http://docs.angularjs.org/api/ng.$http#get та https://docs.angularjs.org/api/ng/service/$http#usage (показує paramsпарам)


17
це поверне обіцянку
Коннор Ліч

1
Код із обіцянкою: $ http ({метод: 'GET', url: '/ someUrl'}). успіх (функція (дані, стан, заголовки, конфігурація) {// цей зворотний виклик буде називатися асинхронно // коли відповідь буде доступна}). помилка (функція (дані, стан, заголовки, конфігурація) {// викликається асинхронно, якщо виникає помилка // або сервер повертає відповідь зі статусом помилки.});
Егуд Гранд

130
Кутовий також забезпечує функціональність в $http.get(url.details_path, {params: {user_id: user.id}}).
enpenax

15
Було б непогано дотримуватись об'єктного ключа узгодженим між HTTP-дієсловами ... наявність даних для POST та парами для GET є протизаконною.
Хуберт Перрон

7
@HubertPerron Насправді це не протиінтуїтивно, оскільки це різні речі: DATA може представляти об’єкт / модель, навіть вкладені і стає частиною заголовка POST ... PARAMS представляють те, що можна додати до URL-адреси GET, де кожне властивість являє собою частина запиту в рядку URL-адреси. Добре, що вони мають різні імена, тому що вони дають вам знати про те, що ви робите щось інше.
Джос

520

Ви можете передати парами безпосередньо в $http.get()наступне

$http.get(user.details_path, {
    params: { user_id: user.id }
});

2
Це працює, але парам-об'єкт перетворюється в String. Як я зберігаю оригінальний об'єкт?
wdphd

13
@wdphd HTTP властиво, що він буде закодований у рядок запиту
Uli Köhler

1
@Uli Köhler: Так, це пропустив. Я роздумував над маршрутизатором інтерфейсу користувача, де можна вказати тип даних парами. Виправлено це за допомогою простого розбору на бекенді.
wdphd

2
Це правильне рішення, якщо ви хочете додати параметри GET до вказаної URL-адреси і працює чудово.
енпенакс


43

Починаючи з AngularJS v1.4.8 , ви можете використовувати get(url, config) наступне:

var data = {
 user_id:user.id
};

var config = {
 params: data,
 headers : {'Accept' : 'application/json'}
};

$http.get(user.details_path, config).then(function(response) {
   // process response here..
 }, function(response) {
});

1
Але ці дані все ще не є органом запиту.
naXa

@naXa GET має бути URL-адресом лише за домовленістю, тому багато рамок не дозволяють йому застосовувати кращі практики, навіть якщо технічно це може працювати і може мати сенс.
Крістоф Руссі

1
Якби тільки документація AngularJS могла б надати цей простий приклад!
Норберт Норбертсон

@Arpit Aggarwal Ви б так люб'язно подивились на моє подібне питання з веб-сервером golang та vue.js? stackoverflow.com/questions/61520048 / ...
user2315094

33

Рішення для тих, хто зацікавлений надсилати парами та заголовки у GET-запиті

$http.get('https://www.your-website.com/api/users.json', {
        params:  {page: 1, limit: 100, sort: 'name', direction: 'desc'},
        headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
    }
)
.then(function(response) {
    // Request completed successfully
}, function(x) {
    // Request error
});

Повний приклад обслуговування виглядатиме так

var mainApp = angular.module("mainApp", []);

mainApp.service('UserService', function($http, $q){

   this.getUsers = function(page = 1, limit = 100, sort = 'id', direction = 'desc') {

        var dfrd = $q.defer();
        $http.get('https://www.your-website.com/api/users.json', 
            {
                params:{page: page, limit: limit, sort: sort, direction: direction},
                headers: {Authorization: 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
            }
        )
        .then(function(response) {
            if ( response.data.success == true ) { 

            } else {

            }
        }, function(x) {

            dfrd.reject(true);
        });
        return dfrd.promise;
   }

});

Як би використовувались дані відповіді в контролері? Дякую.
Флоріс

3

Можна навіть просто додати параметри до кінця URL-адреси:

$http.get('path/to/script.php?param=hello').success(function(data) {
    alert(data);
});

У парі з script.php:

<? var_dump($_GET); ?>

У результаті з'являється таке попередження javascript:

array(1) {  
    ["param"]=>  
    string(4) "hello"
}

2
$ http робить якісь втечі?
Майкл Коул

2
Це також працює, але проблема з цим полягає в тому, що коли у вас є кілька параметрів, це стає болем, додаючи їх до кінця URL-адреси плюс, якщо ви зміните ім'я змінної, ви повинні прийти і змінити її в URL-адресі.
користувач3718908

Я знаю. Це було більше демонстрацією, показавши, що ви навіть можете це робити регулярно , я не обов'язково рекомендую. (Де "звичайний спосіб" означає, як ви, ймовірно, робили це роками з php)
Джеффрі Русендал,

2

Ось повний приклад запиту HTTP GET з параметрами, що використовують angular.js в ASP.NET MVC:

КОНТРОЛЕР:

public class AngularController : Controller
{
    public JsonResult GetFullName(string name, string surname)
    {
        System.Diagnostics.Debugger.Break();
        return Json(new { fullName = String.Format("{0} {1}",name,surname) }, JsonRequestBehavior.AllowGet);
    }
}

ПОГЛЯД:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script type="text/javascript">
    var myApp = angular.module("app", []);

    myApp.controller('controller', function ($scope, $http) {

        $scope.GetFullName = function (employee) {

            //The url is as follows - ControllerName/ActionName?name=nameValue&surname=surnameValue

            $http.get("/Angular/GetFullName?name=" + $scope.name + "&surname=" + $scope.surname).
            success(function (data, status, headers, config) {
                alert('Your full name is - ' + data.fullName);
            }).
            error(function (data, status, headers, config) {
                alert("An error occurred during the AJAX request");
            });

        }
    });

</script>

<div ng-app="app" ng-controller="controller">

    <input type="text" ng-model="name" />
    <input type="text" ng-model="surname" />
    <input type="button" ng-click="GetFullName()" value="Get Full Name" />
</div>

IMHO Синтаксис з paramsменшою схильністю до помилок, ніж "ручний" URL-адрес,
Крістоф Руссі

1

Для надсилання отримати запит з параметром i use

  $http.get('urlPartOne\\'+parameter+'\\urlPartTwo')

Цим ви можете використовувати свій власний рядок URL

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.