AngularJSが$ http.getリクエストにデータを渡す


577

http POSTリクエストを実行する関数があります。コードを以下に示します。これは正常に動作します。

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

http GETの別の関数があり、その要求にデータを送信したい。しかし、getにはそのオプションはありません。

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

の構文http.get

get(url、config)

回答:


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#usageparamsパラメーターを表示)


17
これは約束を返します
コナーリーチ2014年

1
約束のあるコード:$ http({method: 'GET'、url: '/ someUrl'})。success(function(data、status、headers、config){//このコールバックは、//応答が利用可能になると非同期に呼び出されます})。error(function(data、status、headers、config){//エラーが発生した場合、またはサーバーがエラーステータスのレスポンスを返した場合、//非同期的に呼び出されます。}}
Ehud Grand

130
Angularはの機能も提供します$http.get(url.details_path, {params: {user_id: user.id}})
enpenax

15
HTTP動詞間でオブジェクトキーの整合性を保つのは良かったでしょう... POSTのデータとGETのパラメーターを持つことは直観に反します。
Hubert Perron

7
@HubertPerronこれらは異なるため、実際には直感的ではありません。DATAはオブジェクト/モデルを表すことができ、ネストされていてもPOSTヘッダーの一部になります... PARAMSはGET urlに追加できるものを表し、各プロパティはURLのクエリ文字列の一部。異なる名前を付けているのは良いことです。何か違うことをしているという事実に気づくからです。
Jos

520

あなた直接params 渡すことができ$http.get()ます次はうまくいきます

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

2
これは機能しますが、paramsオブジェクトは文字列に変換されます。元のオブジェクトを保持するにはどうすればよいですか?
wdphd 2015年

13
@wdphdそれは、クエリ文字列に符号化されることWLLことをHTTPに固有のものである
ウリ・ケーラー

1
@ウリケーラー:うん、これを逃した。paramsデータ型を指定できるUIルーターに沿って考えていました。バックエンドの単純なparseIntでこれを修正しました。
wdphd 2015年

2
これは、指定されたURLにGETパラメータを追加して完全に正常に機能させる場合の正しい解決策です。
enpenax

1
Rob

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パラメータにする必要があるため、多くのフレームワークでは、技術的に機能して意味があったとしても、ベストプラクティスを適用できません。
Christophe Roussy

1
AngularJSのドキュメントだけでこの簡単な例を提供できたとしたら!
Norbert Norbertson 2017年

@Arpit Aggarwalは、golang Webサーバーと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;
   }

});

応答データはコントローラーでどのように使用されますか?ありがとう。
フローリス2017年

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はエスケープしますか?
Michael Cole

2
これも機能しますが、これに関する問題は、複数のパラメーターがある場合、URLの末尾にパラメーターを追加するのが面倒になることと、変数名を変更した場合、URLでも変更する必要があるということです。
user3718908

知っている。これはもっとデモンストレーションであり、通常の方法も実行できることを示しています。必ずしもお勧めするわけではありません。(「通常の方法」とは、おそらく何年もphpでこれを行ってきた方法を意味します)
Jeffrey Roosendaal

2

ASP.NET MVCでangular.jsを使用してパラメーターを指定したHTTP GETリクエストの完全な例を次に示します。

コントローラ:

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連結よりもエラーが発生しにくい
Christophe Roussy

1

パラメータを使用してgetリクエストを送信するために使用します

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

これにより、独自のURL文字列を使用できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.