Saya menggunakan Angular 4 HttpClient
untuk mengirim permintaan ke layanan eksternal. Ini adalah pengaturan yang sangat standar:
this.httpClient.get(url).subscribe(response => {
//do something with response
}, err => {
console.log(err.message);
}, () => {
console.log('completed');
}
Masalahnya adalah, ketika permintaan gagal saya melihat Http failure response for (unknown url): 0 Unknown Error
pesan umum
di konsol. Sementara itu, ketika saya memeriksa permintaan yang gagal di chrome, saya dapat melihat status tanggapannya adalah 422, dan di tab "pratinjau" saya melihat pesan sebenarnya yang menjelaskan penyebab kegagalan.
Bagaimana cara mengakses pesan tanggapan sebenarnya yang dapat saya lihat di alat dev chrome?
angular
typescript
grdl
sumber
sumber
err
objek - tidak hanyamessage
Jawaban:
Masalahnya terkait dengan CORS . Saya melihat bahwa ada kesalahan lain di konsol Chrome:
Ini berarti respons dari server backend tidak memiliki
Access-Control-Allow-Origin
header meskipun nginx backend dikonfigurasi untuk menambahkan header tersebut ke respons denganadd_header
direktif .Namun, arahan ini hanya menambahkan header jika kode respons 20X atau 30X. Pada tanggapan kesalahan, header hilang. Saya perlu menggunakan
always
parameter untuk memastikan header ditambahkan terlepas dari kode respons:add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;
Setelah backend dikonfigurasi dengan benar, saya dapat mengakses pesan kesalahan sebenarnya dalam kode Angular.
sumber
Jika ada orang lain yang akhirnya tersesat seperti saya ... Masalah saya BUKAN karena CORS (Saya memiliki kendali penuh atas server dan CORS telah dikonfigurasi dengan benar!).
Masalah saya adalah karena saya menggunakan platform Android level 28 yang menonaktifkan komunikasi jaringan cleartext secara default dan saya mencoba mengembangkan aplikasi yang mengarah ke IP laptop saya (yang menjalankan server API). URL dasar API adalah seperti http: // [LAPTOP_IP]: 8081 . Karena bukan https , tampilan web android sepenuhnya memblokir xfer jaringan antara ponsel / emulator dan server di laptop saya. Untuk memperbaikinya:
Tambahkan konfigurasi keamanan jaringan
File baru dalam proyek: resources / android / xml / network_security_config.xml
CATATAN: Ini harus digunakan dengan hati-hati karena akan mengizinkan semua teks bebas dari aplikasi Anda (tidak ada yang dipaksa untuk menggunakan https). Anda dapat membatasinya lebih lanjut jika Anda mau.
Referensi konfigurasi di config.xml utama
Itu dia! Dari sana saya membangun kembali APK dan aplikasi sekarang dapat berkomunikasi dari emulator dan telepon.
Info lebih lanjut tentang jaringan sec: https://developer.android.com/training/articles/security-config.html#CleartextTrafficPermitted
sumber
http
.. itu tidak akan menjadi masalah jika saya menggunakanhttps
.... tapi dalam kasus saya masih ingin menggunakanhttp
, saya langsung menambahkanandroid:usesCleartextTraffic="true"
diapplication
tag diAndroidManifest.xml
. ..dan berhasil .... terima kasih telah menyebutkan tentangcleartext
...berfungsi untuk saya setelah mematikan ekstensi blokir iklan di chrome, kesalahan ini kadang-kadang muncul karena sesuatu yang memblokir http di browser
sumber
Jika Anda menggunakan aplikasi .NET Core, solusi ini mungkin membantu!
Selain itu, ini mungkin bukan Angular atau kesalahan permintaan lainnya di aplikasi front end Anda
Pertama, Anda harus menambahkan paket Microsoft CORS Nuget:
Kemudian Anda perlu menambahkan layanan CORS di startup.cs Anda. Dalam metode ConfigureServices, Anda harus memiliki sesuatu yang mirip dengan berikut ini:
Selanjutnya, tambahkan middleware CORS ke aplikasi Anda. Di startup.cs Anda, Anda harus memiliki metode Konfigurasi. Anda harus memilikinya seperti ini:
Opsi lambda adalah API yang lancar sehingga Anda dapat menambah / menghapus opsi tambahan yang Anda butuhkan. Anda sebenarnya dapat menggunakan opsi "AllowAnyOrigin" untuk menerima domain apa pun, tetapi saya sangat menyarankan Anda untuk tidak melakukan ini karena ini akan membuka panggilan lintas sumber dari siapa pun. Anda juga dapat membatasi panggilan lintas sumber ke Metode HTTP mereka (GET / PUT / POST, dll.), Sehingga Anda hanya dapat mengekspos panggilan GET lintas domain, dll.
sumber
Kesalahan ini terjadi pada saya di Firefox tetapi bukan Chrome saat mengembangkan secara lokal, dan itu ternyata disebabkan oleh Firefox tidak mempercayai sertifikat ssl API lokal saya (yang tidak valid, tetapi saya telah menambahkannya ke toko sertifikat lokal saya, yang memungkinkan chrome mempercayainya tetapi tidak ff). Menavigasi ke API secara langsung dan menambahkan pengecualian di Firefox memperbaiki masalah tersebut.
sumber
Bagi saya itu disebabkan oleh sisi server JsonSerializerException.
Klien berkata:
Menyederhanakan jenis respons dengan menghilangkan loop memecahkan masalah.
sumber
Jika Anda menggunakan Laravel sebagai Backend Anda, maka edit file .htaccess Anda hanya dengan menempelkan kode ini, untuk menyelesaikan masalah CROS di proyek Angular atau IONIC Anda
sumber
Kesalahan serupa dapat terjadi, jika Anda tidak memberikan token dan sertifikat klien yang valid yang dipahami server Anda:
Kesalahan:
Kode contoh:
Perhatikan bahwa
MyClientCert
&MyToken
adalah string kosong, oleh karena itu kesalahannya.MyClientCert
&MyToken
dapat berupa nama apa pun yang dipahami server Anda.sumber
Saya menggunakan ASP.NET SPA Extensions yang membuatkan saya proxy pada port 5000 dan 5001 yang melewati port Angular 4200 selama pengembangan.
Saya telah mengatur CORS dengan benar untuk https port 5001 dan semuanya baik-baik saja, tetapi saya secara tidak sengaja membuka bookmark lama untuk port 5000. Lalu tiba-tiba pesan ini muncul. Seperti yang dikatakan orang lain di konsol, ada pesan kesalahan 'preflight'.
Jadi terlepas dari lingkungan Anda, jika Anda menggunakan CORS, pastikan Anda memiliki semua port yang ditentukan - karena host dan port keduanya penting.
sumber
Saya mendapatkan pesan persis seperti itu setiap kali permintaan saya membutuhkan waktu lebih dari 2 menit untuk diselesaikan. Browser akan memutuskan sambungan dari permintaan, tetapi permintaan di backend terus berlanjut hingga selesai. Server (ASP.NET Web API dalam kasus saya) tidak akan mendeteksi pemutusan sambungan.
Setelah seharian mencari, saya akhirnya menemukan jawaban ini , menjelaskan bahwa jika Anda menggunakan konfigurasi proxy , ia memiliki batas waktu default 120 detik (atau 2 menit).
Jadi, Anda dapat mengedit konfigurasi proxy Anda dan mengaturnya ke apa pun yang Anda butuhkan:
Sekarang, saya menggunakan agentkeepalive untuk membuatnya berfungsi dengan otentikasi NTLM , dan tidak tahu bahwa batas waktu agen tidak ada hubungannya dengan batas waktu proxy, jadi keduanya harus disetel. Butuh beberapa saat bagi saya untuk menyadarinya, jadi inilah contohnya:
sumber
Bagi saya itu adalah masalah browser, karena permintaan saya berfungsi dengan baik di Postman.
Ternyata karena alasan tertentu, Firefox dan Chrome memblokir permintaan yang masuk ke porta
6000
, setelah saya mengubah port API ASP.NET ke4000
, kesalahan berubah menjadi kesalahan CORS yang diketahui yang dapat saya perbaiki.Chrome setidaknya menunjukkan kepada saya
ERR_UNSAFE_PORT
yang memberi saya petunjuk tentang apa yang salah.sumber
Jika Anda memiliki tajuk kors yang tepat. Jaringan perusahaan Anda mungkin melepaskan header cors. Jika situs web dapat diakses secara eksternal, coba akses dari luar jaringan Anda untuk memverifikasi apakah jaringan yang menyebabkan masalah - ide bagus apa pun penyebabnya.
sumber
Di inti asp.net, Jika pengontrol api Anda tidak memiliki anotasi yang dipanggil
[AllowAnonymous]
, tambahkan di atas nama pengontrol Anda sepertisumber
Tidak setua pertanyaan lain, tetapi saya hanya berjuang dengan ini di aplikasi Ionic-Laravel, dan tidak ada yang berfungsi dari sini (dan posting lain), jadi saya menginstal https://github.com/barryvdh/laravel-cors pelengkap di Laravel dan memulai dan itu bekerja dengan cukup baik.
sumber
Milik saya disebabkan oleh hubungan yang tidak valid dalam model yang saya coba tanyakan. Dipecahkan dengan men-debug respons yang mogok di relasi.
sumber
Bagi saya itu bukan masalah sudut. Adalah bidang tipe DateTime di DB yang memiliki nilai (0000-00-00) dan model saya tidak dapat mengikat properti itu dengan benar, jadi saya mengubahnya ke nilai yang valid seperti (2019-08-12).
Saya menggunakan .net core, OData v4 dan MySql (konektor EF pomelo)
sumber
sumber
Jika ini adalah layanan node, coba langkah-langkah yang diuraikan di sini
Pada dasarnya, ini adalah kesalahan Berbagi Sumber Daya Lintas Asal (CORS). Informasi lebih lanjut tentang kesalahan tersebut di sini .
Setelah saya memperbarui layanan node saya dengan baris berikut ini berfungsi:
sumber
Kesalahan saya adalah bahwa file tersebut terlalu besar (inti dotnet tampaknya memiliki batas @ ~ 25Mb). Pengaturan
memecahkan masalah untuk saya.
sumber