कोणीय HttpClient "पार्सिंग के दौरान Http विफलता"


106

मैं अपने Laravel बैकएंड को Angular 4 से POST अनुरोध भेजने का प्रयास करता हूं।

मेरा लॉगिन सेवा में यह विधि है:

login(email: string, password: string) {
    return this.http.post(`http://10.0.1.19/login`, { email, password })
}

मैं अपने LoginComponent में इस विधि की सदस्यता लेता हूं:

.subscribe(
    (response: any) => {
        console.log(response)
        location.reload()
    }, 
    (error: any) => {
        console.log(error)
    })

और यह मेरी लारवेल बैकेंड विधि है:

...

if($this->auth->attempt(['email' => $email, 'password' => $password], true)) {
  return response('Success', 200);
}

return response('Unauthorized', 401);

मेरे क्रोम देव उपकरण कहते हैं कि मेरा अनुरोध 200 स्थिति कोड के साथ एक सफलता थी। लेकिन मेरा कोणीय कोड errorब्लॉक को ट्रिगर करता है और मुझे यह संदेश देता है:

के लिए पार्स करने के दौरान http विफलता http://10.0.1.19/api/login

यदि मैं अपने बैकएंड से एक खाली सरणी लौटाता हूं, तो यह काम करता है ... तो एंगुलर जौन के रूप में मेरी प्रतिक्रिया को पार्स करने की कोशिश कर रहा है? मैं इसे कैसे निष्क्रिय कर सकता हूं?

जवाबों:


232

आप निर्दिष्ट कर सकते हैं कि लौटाया जाने वाला डेटा है JSON का उपयोग नहीं कर रहा है responseType

अपने उदाहरण में, आप एक responseTypeस्ट्रिंग मान का उपयोग कर सकते हैंtext , जैसे:

return this.http.post(
    'http://10.0.1.19/login',
    {email, password},
    {responseType: 'text'})

के लिए विकल्पों की पूरी सूची responseTypeनिम्न है:

  • json (डिफ़ॉल्ट)
  • text
  • arraybuffer
  • blob

अधिक जानकारी के लिए डॉक्स देखें ।



3

यहां तक ​​कि responseType को जोड़ते हुए, मैंने इसे बिना किसी सफलता के दिनों के लिए निपटा दिया। आखिरकार मुझे मिल गया। सुनिश्चित करें कि आपकी बैकेंड स्क्रिप्ट में आप शीर्ष लेख को परिभाषित नहीं करते हैं - ("सामग्री-प्रकार: अनुप्रयोग / json)";

Becuase यदि आप इसे पाठ में बदल देते हैं, लेकिन बैकएंड json के लिए पूछता है, तो यह एक त्रुटि लौटाएगा ...


इसके अलावा, आप नए वर्ग से प्राप्त नई वस्तु के मापदंडों के रूप में सेट कर सकते हैं। फिर इस ऑब्जेक्ट को प्रतिक्रिया के रूप में वापस करें। यानी आप JSON फॉर्मेट में अपनी प्रतिक्रिया बदल सकते हैं
whitefang

1

आपको JSON (DevTools में नहीं, बल्कि बैकएंड पर भी) की जाँच करनी चाहिए। कोणीय HttpClient JSON के साथ एक कठिन समय पार्स कर रहा है\0 पात्रों के है और DevTools तब अनदेखा कर देंगे, इसलिए क्रोम में स्पॉट करना काफी कठिन है।

इस लेख के आधार पर


1

मेरे पास एक ही समस्या थी और इसका कारण यह था कि आपके बैकेंड (वसंत) में एक स्ट्रिंग लौटने के समय आप "स्प्रिंग" के रूप में वापस लौट रहे होंगे; लेकिन यह वसंत के अनुसार सही नहीं है। इसके बजाय रिटर्न "\" स्प्रिंग यूज्ड \ "का उपयोग करें; -मित्रों अलविदा


समीक्षा से: नमस्ते, यह पोस्ट प्रश्न का एक गुणवत्ता उत्तर प्रदान नहीं करता है । कृपया या तो अपने उत्तर को संपादित करें और इसे सुधारें, या इसे टिप्पणी के रूप में पोस्ट करें।
s --unıɐ ɐ qɐp

उदाहरण के लिए ठीक है। मेरी स्थिति में मैं फ़्रंटेंड में बैकेंड और कोणीय के रूप में स्प्रिंग का उपयोग कर रहा था। सही प्रमाणीकरण के बाद मेरे स्प्रिंग सर्वर को मुझे एक स्ट्रिंग "वैध" वापस करना होगा जो केवल तभी संसाधित होता है जब लॉगिन जानकारी सही होती है।
AVI

मेरे कार्यक्रम के साथ समस्या समान थी। पार्सिंग के दौरान Http की असफलता .... फिर मुझे एहसास हुआ कि वसंत "मेरे सर्वर की प्रतिक्रिया को विशेष चरित्र के रूप में मान रहा है। मुझे एक स्ट्रिंग वापस करनी होगी जिसे बैकेंड भी समझ सकता है ... इसलिए मैंने" \ "वैध \" लौटाया वेब में "मान्य" और \ संकेतन के बजाय स्ट्रिंग के उल्टे अल्पविराम के अंदर लिखे एक "(उल्टे कोमा) को निर्दिष्ट करने के लिए उपयोग किया जाता है" "" "" के बजाय "\" \ ""। और उस त्रुटि के बाद कहीं नहीं देखा गया था..मुझे उम्मीद है कि अब और अधिक स्पष्ट @ sɔunı error ɐ qɐp
AVI

0

मैं अपने कोणीय अनुप्रयोग में इसी मुद्दे का सामना कर रहा था। मैं अपने एप्लिकेशन में RocketChat REST API का उपयोग कर रहा था और मैं rooms.createDiscussionनीचे उपयोग करने की कोशिश कर रहा था , लेकिन नीचे एक त्रुटि के रूप में।

ERROR Error: Uncaught (in promise): HttpErrorResponse: {"headers":{"normalizedNames":{},"lazyUpdate":null},"status":200,"statusText":"OK","url":"myurl/rocketchat/api/v1/rooms.createDiscussion","ok":false,"name":"HttpErrorResponse","message":"Http failure during parsing for myrul/rocketchat/api/v1/rooms.createDiscussion","error":{"error":{},"text":"

मैंने कुछ चीजों को बदलने की कोशिश की है, responseType: 'text'लेकिन उनमें से किसी ने भी काम नहीं किया। अंत में मैं अपने RocketChat स्थापना के साथ इस मुद्दे को खोजने में सक्षम था। जैसा कि RocketChat बदलाव लॉग में उल्लेख किया गया है कि एपीआई rooms.createDiscussionको संस्करण 1.0.0 में पेश किया गया है। दुर्भाग्य से मैं एक कम संस्करण का उपयोग कर रहा था।

मेरा सुझाव है कि आप अपने कोणीय कोड में त्रुटि को ठीक करने के लिए समय बिताने से पहले REST API ठीक काम कर रहे हैं या नहीं। मैंने curlयह जांचने के लिए कमांड का उपयोग किया ।

curl -H "X-Auth-Token: token" -H "X-User-Id: userid" -H "Content-Type: application/json" myurl/rocketchat/api/v1/rooms.createDiscussion -d '{ "prid": "GENERAL", "t_name": "Discussion Name"}'

वहाँ भी मुझे एक प्रतिक्रिया के रूप में अमान्य HTML मिल रहा था।

<!DOCTYPE html>
<html>
<head>
<meta name="referrer" content="origin-when-crossorigin">
<script>/* eslint-disable */

'use strict';
(function() {
        var debounce = function debounce(func, wait, immediate) {

एक मान्य JSON प्रतिक्रिया के बजाय निम्नानुसार है।

{
    "discussion": {
        "rid": "cgk88DHLHexwMaFWh",
        "name": "WJNEAM7W45wRYitHo",
        "fname": "Discussion Name",
        "t": "p",
        "msgs": 0,
        "usersCount": 0,
        "u": {
            "_id": "rocketchat.internal.admin.test",
            "username": "rocketchat.internal.admin.test"
        },
        "topic": "general",
        "prid": "GENERAL",
        "ts": "2019-04-03T01:35:32.271Z",
        "ro": false,
        "sysMes": true,
        "default": false,
        "_updatedAt": "2019-04-03T01:35:32.280Z",
        "_id": "cgk88DHLHexwMaFWh"
    },
    "success": true
}

इसलिए नवीनतम RocketChat में अपडेट करने के बाद मैं उल्लेखित REST API का उपयोग करने में सक्षम था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.