Dalam kode di bawah ini, $http
metode AngularJS memanggil URL, dan mengirimkan objek xsrf sebagai "Minta Payload" (seperti yang dijelaskan dalam tab jaringan debugger Chrome). $.ajax
Metode jQuery melakukan panggilan yang sama, tetapi mengirimkan xsrf sebagai "Form Data".
Bagaimana saya bisa membuat AngularJS mengirimkan xsrf sebagai data formulir alih-alih muatan permintaan?
var url = 'http://somewhere.com/';
var xsrf = {fkey: 'xsrf key'};
$http({
method: 'POST',
url: url,
data: xsrf
}).success(function () {});
$.ajax({
type: 'POST',
url: url,
data: xsrf,
dataType: 'json',
success: function() {}
});
ajax
angularjs
post
angular-http
mjibson
sumber
sumber
Jawaban:
Baris berikut perlu ditambahkan ke objek $ http yang diteruskan:
Dan data yang dikirimkan harus dikonversi ke string yang disandikan URL:
Jadi, Anda memiliki sesuatu seperti:
Dari: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ
MEMPERBARUI
Untuk menggunakan layanan baru yang ditambahkan dengan AngularJS V1.4, lihat
sumber
var xsrf = $.param({fkey: "key"});
Itu bodoh, mengapa sudut tidak bisa melakukannya secara internal?headers: {Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
Jika Anda tidak ingin menggunakan jQuery dalam solusi, Anda bisa mencoba ini. Solusi diperoleh dari sini https://stackoverflow.com/a/1714899/1784301
sumber
for
pernyataan untuk digunakanangular.forEach
.obj[p]
itu tidak nol atau tidak terdefinisi . Kalau tidak, Anda akhirnya akan mengirim string "null" atau "undefined" sebagai nilai.transformRequest: function(obj)
Karena obj tidak terdefinisi, Apakah kita harus lulus xsrf? SepertitransformRequest: function(xsrf)
Kebingungan yang terus berlanjut seputar masalah ini mengilhami saya untuk menulis posting blog tentang hal itu. Solusi yang saya usulkan dalam posting ini lebih baik daripada solusi teratas Anda saat ini karena tidak membatasi Anda untuk parametrizing objek data Anda untuk panggilan layanan $ http; yaitu dengan solusi saya, Anda dapat terus meneruskan objek data aktual ke $ http.post (), dll. dan masih mencapai hasil yang diinginkan.
Juga, jawaban berperingkat teratas bergantung pada dimasukkannya jQuery penuh di halaman untuk fungsi $ .param (), sedangkan solusi saya adalah jQuery agnostic, AngularJS murni siap.
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
Semoga ini membantu.
sumber
ASP.NET
tidak 'secara native' mendukung ini. Jika Anda tidak ingin mengubah perilaku AngularJS (yang tidak saya lakukan, karena API saya mengembalikan JSON, mengapa tidak menerima JSON juga, ini lebih fleksibel daripada data formulir) Anda dapat membaca dariRequest.InputStream
dan kemudian menanganinya dengan cara apa pun Anda ingin. (Saya memilih untuk membatalkan deserialisasidynamic
agar mudah digunakan.)Saya mengambil beberapa jawaban lain dan membuat sesuatu yang sedikit lebih bersih, letakkan
.config()
panggilan ini di ujung angular.module Anda di app.js:sumber
unshift()
sehingga transformasi lainnya tetap tidak terganggu. Kerja bagus.Pada AngularJS v1.4.0, ada layanan built-in
$httpParamSerializer
yang mengubah objek apa pun menjadi bagian dari permintaan HTTP sesuai dengan aturan yang tercantum pada halaman dokumen .Dapat digunakan seperti ini:
Ingat bahwa untuk posting bentuk yang benar,
Content-Type
tajuk harus diubah. Untuk melakukan ini secara global untuk semua permintaan POST, kode ini (diambil dari setengah jawaban Albireo) dapat digunakan:Untuk melakukan ini hanya untuk posting saat ini,
headers
properti dari objek-permintaan perlu diubah:sumber
transformRequest: $httpParamSerializer, data: formDataObj
. Terima kasih atas solusinya.Anda dapat mendefinisikan perilaku secara global:
Jadi Anda tidak perlu mendefinisikannya kembali setiap waktu:
sumber
Sebagai solusinya, Anda cukup membuat kode yang menerima POST merespons data aplikasi / json. Untuk PHP saya menambahkan kode di bawah ini, memungkinkan saya untuk POST untuk itu baik dalam bentuk-disandikan atau JSON.
sumber
Jawaban-jawaban ini terlihat seperti gila berlebihan, kadang-kadang, sederhana hanya lebih baik:
sumber
Content-Type
dan mengaturnyaapplication/x-www-form-urlencoded
.Anda dapat mencoba dengan solusi di bawah ini
sumber
Buat layanan adaptor untuk posting:
Gunakan di pengontrol Anda atau apa pun:
sumber
Ada tutorial yang sangat bagus yang membahas hal ini dan hal-hal terkait lainnya - Menyerahkan Formulir AJAX: Cara AngularJS .
Pada dasarnya, Anda perlu mengatur tajuk permintaan POST untuk menunjukkan bahwa Anda mengirim data formulir sebagai string yang disandikan URL, dan mengatur data yang akan dikirim dengan format yang sama
Perhatikan bahwa fungsi pembantu param () jQuery digunakan di sini untuk membuat serialisasi data ke dalam sebuah string, tetapi Anda dapat melakukan ini secara manual juga jika tidak menggunakan jQuery.
sumber
$.param
melakukan keajaiban. solusi sempurna untuk yang memiliki aplikasi berbasis jQuery + AngularJS.Silakan checkout! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
sumber
Untuk pengguna Symfony2:
Jika Anda tidak ingin mengubah apa pun di javascript Anda agar berfungsi, Anda dapat melakukan modifikasi ini di aplikasi symfony Anda:
Buat kelas yang memperluas kelas Symfony \ Component \ HttpFoundation \ Request:
Sekarang gunakan kelas Anda di app_dev.php (atau file indeks apa pun yang Anda gunakan)
sumber
Cukup atur Content-Type tidak cukup, url encode data formulir sebelum mengirim.
$http.post(url, jQuery.param(data))
sumber
Saat ini saya menggunakan solusi berikut yang saya temukan di grup google AngularJS.
Perhatikan bahwa jika Anda menggunakan PHP, Anda harus menggunakan sesuatu seperti komponen HTTP Symfony 2
Request::createFromGlobals()
untuk membaca ini, karena $ _POST tidak akan secara otomatis dimuat dengannya.sumber
AngularJS melakukannya dengan benar saat melakukan tipe-konten berikut di dalam header http-request:
Jika Anda menggunakan php seperti saya, atau bahkan dengan Symfony2, Anda cukup memperluas kompatibilitas server Anda untuk standar json seperti dijelaskan di sini: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html
Cara Symfony2 (misalnya di dalam DefaultController Anda):
Keuntungannya adalah, bahwa Anda tidak perlu menggunakan param jQuery dan Anda bisa menggunakan AngularJS cara asalnya untuk melakukan permintaan seperti itu.
sumber
Jawaban lengkap (sejak sudut 1.4). Anda harus menyertakan de dependency $ httpParamSerializer
sumber
Di konfigurasi aplikasi Anda -
Dengan permintaan sumber daya Anda -
sumber
Ini bukan jawaban langsung, melainkan arah desain yang sedikit berbeda:
Jangan memposting data sebagai formulir, tetapi sebagai objek JSON yang akan langsung dipetakan ke objek sisi server, atau gunakan variabel jalur gaya REST
Sekarang saya tahu tidak ada pilihan yang cocok dalam kasus Anda karena Anda mencoba untuk melewati kunci XSRF. Memetakannya ke variabel path seperti ini adalah desain yang mengerikan:
Karena pada dasarnya Anda ingin meneruskan kunci xsrf ke jalur lain juga
/login
,,/book-appointment
dll. Dan Anda tidak ingin mengacaukan URL cantik AndaMenariknya menambahkannya sebagai bidang objek juga tidak tepat, karena sekarang pada setiap objek json yang Anda lewati ke server Anda harus menambahkan bidang tersebut
Anda tentu tidak ingin menambahkan bidang lain di kelas sisi server Anda yang tidak memiliki asosiasi semantik langsung dengan objek domain.
Menurut pendapat saya cara terbaik untuk melewatkan kunci xsrf Anda adalah melalui header HTTP. Banyak pustaka kerangka kerja web server sisi perlindungan xsrf mendukung ini. Misalnya di Java Spring, Anda bisa meneruskannya menggunakan
X-CSRF-TOKEN
header .Kemampuan Angular yang sangat baik untuk mengikat objek JS ke objek UI berarti kita dapat menyingkirkan praktik posting form bersama-sama, dan mengirim JSON sebagai gantinya. JSON dapat dengan mudah diderialisasi ke objek sisi server dan mendukung struktur data yang kompleks seperti peta, array, objek bersarang, dll.
Bagaimana cara Anda memposting array dalam bentuk muatan? Mungkin seperti ini:
atau ini:
Keduanya desain yang buruk ..
sumber
Ini adalah apa yang saya lakukan untuk kebutuhan saya, Di mana saya perlu mengirim data masuk ke API sebagai data formulir dan Objek Javascript (userData) semakin dikonversi secara otomatis ke URL data yang dikodekan
Ini bagaimana Userdata saya
sumber
Satu-satunya tipis yang harus Anda ubah adalah menggunakan properti "params" daripada "data" saat Anda membuat objek $ http Anda:
Dalam contoh di atas klien [i] hanyalah objek JSON (tidak diserialisasi dengan cara apa pun). Jika Anda menggunakan "params" daripada "data" angular akan membuat serial objek untuk Anda menggunakan $ httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer
sumber
Gunakan
$http
layanan AngularJS dan gunakanpost
metode atau konfigurasikan$http
fungsinya.sumber