Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
29
rated 0 times [  35] [ 6]  / answers: 1 / hits: 56832  / 5 Years ago, wed, february 27, 2019, 12:00:00

I'm trying to correctly interpret the response from a fetch call to an URL, that I think is a json string. I've tried a many variations based on similar posts here, but nothing is getting me useful data to work with. Here is one attempt:



fetch('http://serverURL/api/ready/', {method: POST, mode: no-cors})
.then(function(response) {
response.json().then(function(data) {
console.log('data:' + data);
});
})
.catch(function(err) {
console.log('Fetch Error :-S', err);
});


This returns a syntax error in the console:




SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of
the JSON data




So maybe its not JSON...if I put in a breakpoint on the console.log line, and hover over response (line above), I see the response object (?) with various fields:



Response



Not sure how to interpret that...status:0 suggests it did not get a valid response. However, if I check the Network tab in the developer tools, and click on the fetch line, status there is 200, and the Response window/JSON section shows the message info that you also see if you just put the URL into the browser URL bar directly. As does the Response payload section, which shows the JSON string:




{msg: API is ready., success: true}




So...it looks like json, no? But fetch is unable to ingest this as json?



Here's another variation, but using response.text() instead of response.json()



fetch('http://serverURL/api/ready/', {method: POST, mode: no-cors})
.then((response) => {
console.log(response);
response.text().then((data) => {
console.log(data: + data);
});
});


This prints the response object in the console (same as above: ok: false, status:0, type:opaque etc). The second console.log file prints nothing after data:. If I use response.json, again I get the syntax error about end of data as above.



Any ideas? I realize the server may not be providing what fetch needs or wants, but, it does provide some info (at least when using the URL directly in the browser), which is what I need to then deal with, as json or text or whatever.


More From » json

 Answers
7

Essentially, you cannot access response body from an opaque request.




Adding mode: 'no-cors' won’t magically make things work. Browsers by
default block frontend code from accessing resources cross-origin. If
a site sends Access-Control-Allow-Origin in its responses, then
browsers will relax that blocking and allow your code to access the
response.



But if a site doesn’t send the Access-Control-Allow-Origin header in
its responses, then there’s no way your frontend JavaScript code can
directly access responses from that site. In particular, specifying
mode: 'no-cors' won’t fix that (in fact it’ll just make things worse).




From https://stackoverflow.com/a/43268098/1666071



And also from fetch documentation:




no-cors — Prevents the method from being anything other than HEAD, GET
or POST, and the headers from being anything other than simple
headers. If any ServiceWorkers intercept these requests, they may not
add or override any headers except for those that are simple headers.
In addition, JavaScript may not access any properties of the resulting
Response.
This ensures that ServiceWorkers do not affect the semantics
of the Web and prevents security and privacy issues arising from
leaking data across domains.




https://developer.mozilla.org/en-US/docs/Web/API/Request/mode


[#52525] Friday, February 22, 2019, 5 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
cadendericki

Total Points: 482
Total Questions: 109
Total Answers: 103

Location: Ecuador
Member since Thu, Jun 4, 2020
4 Years ago
cadendericki questions
Wed, Apr 7, 21, 00:00, 3 Years ago
Wed, Jul 8, 20, 00:00, 4 Years ago
Thu, May 14, 20, 00:00, 4 Years ago
;