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คือ

รับ (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#usage (แสดงparamsพารามิเตอร์)


17
สิ่งนี้จะคืนสัญญา
Connor Leech

1
รหัสที่มีสัญญา: $ http ({method: 'GET', url: '/ someUrl'}) ความสำเร็จ (ฟังก์ชั่น (ข้อมูล, สถานะ, ส่วนหัว, การกำหนดค่า) {// การโทรกลับนี้จะถูกเรียกว่าแบบอะซิงโครนัส // เมื่อการตอบสนองพร้อมใช้งาน}) ข้อผิดพลาด (ฟังก์ชัน (ข้อมูลสถานะส่วนหัวการกำหนดค่า) {// เรียกว่าแบบอะซิงโครนัสหากเกิดข้อผิดพลาด // หรือเซิร์ฟเวอร์ส่งคืนการตอบกลับด้วยสถานะข้อผิดพลาด});
Ehud Grand

130
$http.get(url.details_path, {params: {user_id: user.id}})เชิงมุมนอกจากนี้ยังมีฟังก์ชั่นในการ
enpenax

15
มันคงจะดีถ้าเก็บคีย์วัตถุให้สอดคล้องกันระหว่างคำกริยา HTTP ... การมีข้อมูลสำหรับ POST และ params สำหรับ GET นั้นเป็นวิธีที่ใช้งานง่าย
Hubert Perron

7
@HubertPerron จริง ๆ แล้วมันไม่ใช่ counterintuitive เนื่องจากสิ่งเหล่านี้แตกต่างกัน: DATA สามารถแสดงวัตถุ / โมเดลซ้อนกันได้และกลายเป็นส่วนหนึ่งของส่วนหัว POST ... PARAMS แสดงสิ่งที่คุณสามารถเพิ่มลงใน GET url ซึ่งคุณสมบัติแต่ละรายการแสดง ส่วนหนึ่งของการสอบถามใน url เป็นเรื่องดีที่พวกเขามีการตั้งชื่อที่แตกต่างกันเพราะทำให้คุณตระหนักถึงความจริงที่ว่าคุณกำลังทำอะไรที่แตกต่าง
Jos

520

คุณสามารถส่ง params โดยตรงไปยัง$http.get()งานต่อไปนี้ได้ดี

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

2
ใช้งานได้ แต่วัตถุ params กำลังถูกแปลงเป็น String ฉันจะเก็บรักษาวัตถุต้นฉบับได้อย่างไร
wdphd

13
@wdphd มันเป็นธรรมชาติที่ HTTP ว่ามันจะถูกเข้ารหัสไปยังสตริงแบบสอบถาม
23415 Uli Köhler

1
@Uli Köhler: ใช่แล้วพลาดสิ่งนี้ ฉันคิดตามบรรทัดของเราเตอร์ UI ที่คุณสามารถระบุประเภทข้อมูลพารามิเตอร์ แก้ไขสิ่งนี้ด้วยการแยกวิเคราะห์แบบง่าย ๆ ในแบ็กเอนด์
wdphd

2
นี่เป็นทางออกที่ถูกต้องหากคุณต้องการเพิ่มพารามิเตอร์ GET ให้กับ URL ที่กำหนดและทำงานได้อย่างสมบูรณ์
enpenax


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 ควรเป็นพารามิเตอร์แบบแยกส่วนเท่านั้นโดยการประชุมดังนั้นกรอบงานจำนวนมากจะไม่อนุญาตให้บังคับใช้แนวปฏิบัติที่ดีที่สุดแม้ว่าในทางเทคนิคแล้วสามารถใช้งานได้
Christophe Roussy

1
ถ้ามีเพียงเอกสารประกอบของ AngularJS เท่านั้นที่สามารถให้ตัวอย่างง่ายๆนี้ได้!
Norbert Norbertson

@Arpit Aggarwal คุณจะกรุณาดูคำถามที่คล้ายกันของฉันกับ golang เว็บเซิร์ฟเวอร์และ vue.js? stackoverflow.com/questions/61520048/…
user2315094

33

วิธีแก้ปัญหาสำหรับผู้ที่สนใจส่ง params และส่วนหัวในคำขอ 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;
   }

});

ข้อมูลการตอบสนองจะถูกใช้ในคอนโทรลเลอร์ได้อย่างไร? ขอบคุณ
Floris

3

คุณสามารถเพิ่มพารามิเตอร์ลงในส่วนท้ายของ url:

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

จับคู่กับ script.php:

<? var_dump($_GET); ?>

ส่งผลให้การแจ้งเตือนจาวาสคริปต์ต่อไปนี้:

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

2
$ http ทำอะไรได้บ้าง
Michael Cole

2
วิธีนี้ใช้ได้ผลเช่นกัน แต่ปัญหาของเรื่องนี้คือเมื่อคุณมีพารามิเตอร์หลายตัวมันจะกลายเป็นความเจ็บปวดที่เพิ่มเข้าไปในส่วนท้ายของ url plus หากคุณเปลี่ยนชื่อตัวแปรคุณจะต้องมาและเปลี่ยนใน url เช่นกัน
3718908

ฉันรู้ว่า. มันเป็นการสาธิตมากขึ้นโดยแสดงว่าคุณสามารถทำได้ตามปกติฉันไม่จำเป็นต้องแนะนำ (โดยที่ 'วิธีปกติ' หมายถึงวิธีที่คุณอาจทำกับ php มาหลายปี)
Jeffrey Roosendaal

2

นี่คือตัวอย่างที่สมบูรณ์ของคำขอ HTTP GET พร้อมพารามิเตอร์โดยใช้ angular.js ใน ASP.NET MVC:

CONTROLLER:

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

สำหรับการส่งคำขอโดยใช้พารามิเตอร์ที่ฉันใช้

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

โดยสิ่งนี้คุณสามารถใช้สตริง URL ของคุณเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.