So, after beating my head against this for a couple of days, I've come to the 
conclusion that I just don't understand how CORS works.

If I get the following URL: 
https://en.wikipedia.org/w/api.php?action=query&format=json&meta=userinfo&formatversion=2&uiprop=rights

from a browser, I get what I expect:

> {
>   "batchcomplete": true,
>   "query": {
>     "userinfo": {
>       "id": 130326,
>       "name": "RoySmith",
>       "rights": [
> etc
> }

On the command-line with curl, likewise something that makes sense:

> {
>    "batchcomplete" : true,
>    "query" : {
>       "userinfo" : {
>          "anon" : true,
>          "id" : 0,
> etc
> }

But when I do the same fetch from inside a VUE app:

> <template>
>   <main>
>     <button @click="getUserInfo">UserInfo!</button>
>   </main>
> </template>
> 
> <script>
> export default {
>   methods: {
>     getUserInfo() {
>       
> fetch('https://en.wikipedia.org/w/api.php?action=query&format=json&meta=userinfo&formatversion=2&uiprop=rights',
>  { mode: 'no-cors'})
>         .then(function (response) {
>           response
>         })
>     }
>   }
> }
> </script>

I get a 200 response
> Request URL:  
> https://en.wikipedia.org/w/api.php?action=query&format=json&meta=userinfo&formatversion=2&uiprop=rights
> Request Method:  GET
> Status Code:  200 OK
> Remote Address:  (elided)
> Referrer Policy:  strict-origin-when-cross-origin


Request headers:
> :authority: en.wikipedia.org
> :method: GET
> :path: 
> /w/api.php?action=query&format=json&meta=userinfo&formatversion=2&uiprop=rights
> :scheme: https
> accept: */*
> accept-encoding: gzip, deflate, br, zstd
> accept-language: en-US,en;q=0.9
> dnt: 1
> priority: u=1, i
> referer: http://localhost:5173/
> sec-ch-ua: "Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"
> sec-ch-ua-mobile: ?0
> sec-ch-ua-platform: "macOS"
> sec-fetch-dest: empty
> sec-fetch-mode: no-cors
> sec-fetch-site: cross-site
> user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) 
> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36


Response headers:
> accept-ranges: bytes
> age: 2
> cache-control: private, must-revalidate, max-age=0
> content-disposition: inline; filename=api-result.json
> content-encoding: gzip
> content-length: 207
> content-type: application/json; charset=utf-8
> date: Sun, 18 Aug 2024 13:45:15 GMT
> nel: { "report_to": "wm_nel", "max_age": 604800, "failure_fraction": 0.05, 
> "success_fraction": 0.0}
> report-to: { "group": "wm_nel", "max_age": 604800, "endpoints": [{ "url": 
> "https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_uri=/w3c/reportingapi/network_error/1.0.0";
>  }] }
> server: mw-api-ext.eqiad.main-5744d5b77-fzvxz
> server-timing: cache;desc="pass", host;desc="cp1102"
> set-cookie: WMF-Last-Access=18-Aug-2024;Path=/;HttpOnly;secure;Expires=Thu, 
> 19 Sep 2024 12:00:00 GMT
> set-cookie: 
> WMF-Last-Access-Global=18-Aug-2024;Path=/;Domain=.wikipedia.org;HttpOnly;secure;Expires=Thu,
>  19 Sep 2024 12:00:00 GMT
> set-cookie: GeoIP=(elided)
> set-cookie: NetworkProbeLimit=0.001;Path=/;Secure;SameSite=Lax;Max-Age=3600
> strict-transport-security: max-age=106384710; includeSubDomains; preload
> vary: Accept-Encoding
> x-cache: cp1102 miss, cp1102 pass
> x-cache-status: pass
> x-client-ip: (elided)
> x-content-type-options: nosniff
> x-frame-options: DENY

but the response body is empty.  Chrome just says "Failed to load response 
data: No data found for resource with given identifier".  I assume this is just 
Chrome's way of saying "Your brain is not big enough to understand how CORS 
works".  Can anybody help me increase my brain capacity?



> On Aug 15, 2024, at 2:36 PM, Roy Smith <r...@panix.com> wrote:
> 
> Thank you to everybody who offered advice.  I've set up a Vue/Vite 
> environment on my laptop and started working my way through the tutorials.  
> Some stuff makes a lot of sense; other stuff not so much yet, but I'm working 
> on cleaning out some old neural storage areas to make room for new knowledge.
> 
> I think what would help me at this point was being able to look at the source 
> for some well-written Vue apps written to work in the wikipedia environment.  
> If folks could point me to some examples, I would appreciate it.  Are there 
> higher-level wrappers around the Action API, like pywikibot for Python, or do 
> you just do raw fetch calls on the API endpoints?
> 
> 
>> On Aug 8, 2024, at 1:14 PM, Travis Briggs <audiod...@gmail.com> wrote:
>> 
>> Vue.js is definitely a good option. I already had a lot of JavaScript 
>> experience, but I learned Vue at someone's recommendation for a wikimedia 
>> project and it was a great experience.
>> 
>> One quick tip that might help you: in the "old world" you might use jQuery 
>> or something to do AJAX requests (XHR). However, in modern browsers, the 
>> built-in `fetch` function is more than adequate for almost everything.
>> 
>> Also, I would highly recommend using create-vue to bootstrap your project, 
>> because it sets up all the complicated JavaScript "compilation" steps for 
>> you, and gives you commands so that you can just do "npm run build" and get 
>> a static site in a single directory.
>> 
>> Good luck!
>> -Travis
>> 
>> On Thu, Aug 8, 2024 at 8:36 AM Kimmo Virtanen <kimmo.virta...@gmail.com 
>> <mailto:kimmo.virta...@gmail.com>> wrote:
>>> Hi,
>>> 
>>> Vue.js is afaik current choice.
>>> - https://www.mediawiki.org/wiki/Vue.js
>>> 
>>> -- Kimmo
>>> 
>>> On Thu, Aug 8, 2024 at 6:34 PM Roy Smith <r...@panix.com 
>>> <mailto:r...@panix.com>> wrote:
>>>> I'm about to embark on building a client-side javascript tool intended to 
>>>> help with enwiki's [[WP:DYK]] process.  JS is not my strength (and what I 
>>>> do know about tooling is quite outdated) so I'm looking for advice on 
>>>> what's in common use in the WMF environment these days.  If I'm going to 
>>>> learn some new tools, I figure I might as well learn what folks here are 
>>>> using.  If only because it'll make it easier for me to mooch on other 
>>>> people for help :-)
>>>> 
>>>> As far as testing goes, I used to use JUnit.  I gather that's pretty 
>>>> old-hat by now.  What are you-all using?
>>>> 
>>>> And for app frameworks.  Angular?  React?  I hear Vie might be the new 
>>>> hotness?  I'm leaning more towards "easy to learn" vs "most powerful".
>>>> _______________________________________________
>>>> Cloud mailing list -- cloud@lists.wikimedia.org 
>>>> <mailto:cloud@lists.wikimedia.org>
>>>> List information: 
>>>> https://lists.wikimedia.org/postorius/lists/cloud.lists.wikimedia.org/
>>> _______________________________________________
>>> Cloud mailing list -- cloud@lists.wikimedia.org 
>>> <mailto:cloud@lists.wikimedia.org>
>>> List information: 
>>> https://lists.wikimedia.org/postorius/lists/cloud.lists.wikimedia.org/
>> _______________________________________________
>> Cloud mailing list -- cloud@lists.wikimedia.org
>> List information: 
>> https://lists.wikimedia.org/postorius/lists/cloud.lists.wikimedia.org/
> 

_______________________________________________
Cloud mailing list -- cloud@lists.wikimedia.org
List information: 
https://lists.wikimedia.org/postorius/lists/cloud.lists.wikimedia.org/

Reply via email to