CORS needs the API that you're calling (en.wikipedia.org) to whitelist the 
origin you're accessing it from (localhost:5173). MW API supports using a query 
string parameter (`origin`) in order to request that an origin (e.g. 
localhost:5173) is whitelisted through the ACAO 
(<https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin>)
 header (see <https://www.mediawiki.org/wiki/Manual:CORS>). 

> $ curl 
> "https://en.wikipedia.org/w/api.php?action=query&format=json&meta=userinfo&formatversion=2&uiprop=rights&origin=*";
>  --head
> HTTP/2 200
> date: Sun, 18 Aug 2024 17:45:10 GMT
> server: mw-api-ext.codfw.main-6d99499755-vzprs
> x-content-type-options: no sniff
> mediawiki-login-suppressed: true
> access-control-allow-origin: *
> access-control-allow-credentials: false
> access-control-expose-headers: MediaWiki-API-Error, Retry-After, 
> X-Database-Lag, MediaWiki-Login-Suppressed

> On 19 Aug 2024, at 00:59, Roy Smith <r...@panix.com> wrote:
> 
> 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> 
>>> 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> 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
>>> 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/
>> 
> 
> _______________________________________________
> 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