未返回的Ajax请求-Ridgebone文件#001:

约翰·里奇伯恩(John Ridgebone)是代码侦探。 煮熟的刑警,负责解决该市最棘手的编码问题。 跟着他处理他最早的代码案例之一。

Max Langelott在Unsplash上​​拍摄的照片

下面的故事是对现实编程问题的轻松,叙述性表示。 有关完整的技术简介,请阅读故事后的案例回顾。

“约翰·里奇伯恩-侦探”

窗户上的字母看起来好像他们在跳舞。 单个灯泡的暗淡闪烁带来了明显的海市rage楼。 不断恶化的迹象被插入摇摇欲坠的门,门被一千个匆忙的出口撞倒了。 相邻办公空间的状况并没有好得多。

称房间单调乏味是不应该的-贫血更合适。 但是它所缺乏的风格实际上弥补了。 约翰·里奇伯恩(John Ridgebone)的办公室是彻底侦探工作技艺的光辉典范。 一张整齐的桌子埋在松散的报纸和草草打字的文件下。 墙壁上排满了文件柜,只剩下很少的空间。 在漫长的夜里,人们把破败的床铺在一个黑暗的角落里。 那个奇异的灯泡无法照亮这种惨淡的景象。

桌子指向入口,就像一个前哨准备拦截闯入者。 约翰·里奇伯恩本人像一个嘲笑的石像鬼一样坐在办公桌前。 自称为“代码侦探”。

他保持一动不动,呆滞,肘部放在肮脏的桌子上。 他把手托在下巴里,瞪着门。 在他的潜意识中的某个地方,他数了数着金怀表的节奏节奏。 附近一支雪茄烟冒出烟来。

退出时间快到了。 正是那宝贵的时间花在逃避现实上。 在一天的诱人时间里,一瓶半空的苏格兰威士忌最为诱人。 约翰等了一秒钟。 他想象着从椅子上飞起来,关上门,然后发出声音。

“ ……四十五,四十六,四十七…… ”

但是那一刻都没来。 门口微弱的拨浪鼓使侦探发呆。 旋钮刚开始沙沙作响,很快门闩就嘎吱作响,门开了。 只有黑暗从门框外向约翰打招呼。 他抬起脖子,斜眼看了一下,开始拼凑出一个站在空洞中的人的形状。

一个穿着光b的外套和裤子的男人被拖进视野。 约翰注意到的第一件事是男人的手紧紧地握着他的肠子。 接下来是靠近头皮的梳理的长发。 它下垂在他眼镜的框架后面。 汗水从他的额头流出,从他的衣领周围的淡黄色污点来看,这是一个明显的习惯。 他对他有种学术上的表情-聪明。 但是,他衣衫dish的外表和紧张的举止出卖了过度劳累和报酬低廉的生活。 他是那种毫不费力地消失在隔间海中的家伙。 如果不是为了闻。 说话了。

“约翰·里奇伯恩?”

约翰松了口气,把雪茄的尖端捣碎到桌子上。

“是的,没错。 实际上,当我要关闭商店时,”

这个人没有浪费任何时间摸索外套的褶皱。 该行为使约翰的脸部一侧紧张起来。

“请。”他插话。 “我的名字叫伦纳德·巴迪舍(Leonard Badischer)-我知道我是来不经宣布的,但是我很绝望。 我需要您的服务!”

他制作了一堆信封,至少一打,至少捆成一捆。 他开始烦躁不安,两次停下来,擦去手掌上花呢裤子上的汗水。 结缓了下来,字母跌落在地上。 它使约翰想起了某种令人沮丧的股票大游行。

“该死。”伦纳德滑倒。 他没有跳过任何节拍,转身收拾包裹,同时继续认罪。

“我为这家公司Ajax Corporation工作。 好吧,我们称它为Ajax Co-我相信您都听说过它。 这是足够体面的演出,付足够的钱来吃东西等等。”

约翰站起来。 他绕过桌子的四周,与伦纳德面对面并居中休息。 他交叉双臂。

“伦纳德。”

“对。”伦纳德回答。 “我有一个妻子,她住在乡下,离这里约100英里。 我们负担不起住在这座城市的费用,因此,当那些陌生人看着我时,我会跳上一列火车,或者带着一些来来往往的搭便车。”

伦纳德的手的位置不断变化-从他的侧面到他的腰部扭伤。 约翰拉着怀表,看了一眼。 他翻了个白眼,握紧了下巴。

“ 很快 ,”他想,“ 一定要去某个地方。 ”

“但是,”伦纳德继续说道。 “大多数夜晚,我都躲在建筑物的某个地方。 来回旅行并不划算。”

他说话的节奏开始超过他的呼吸。 他停下来了口气。

他继续说道:“我经常把钱还给我,及时提醒您,给她我的薪水。” “当然,我会为自己保留一些东西。 但是,他们一直在增加我的时间-我没有足够的时间回家再回来。 如果我现在离开,就错过工作了……他们肯定会让我放松! 那我们该怎么办?”

伦纳德的烦躁情绪开始加剧。 挫败感加剧时,他开始用左脚爪子爪子。 他的语速越来越高,他的句子开始融合在一起。

“对于克里斯昂·伦纳德(Chrissakes Leonard),已经开始吧!”约翰snap道。 甚至他也很难在推文中介绍伦纳德(Leonard)的谐者的相关信息。 这并没有减轻他不断增长的挫败感。

伦纳德说:“这个周末我无法到达这个国家。” “因此,我试图通过邮寄方式将工资发给她,但信件不断地寄给我! 已经好几天了,我不能把这笔钱给她! 我尝试了邮政局长-这样做的很多好处-他对我来说是如此冷酷,技术如此专业! 我太慌了,我听不懂他对我说的一句话!”

他的声音开始嘶哑。 他屈服的绝望开始减轻了约翰的石质面孔。 在难得的同理心中,他伸出手握住伦纳德的肩膀。

“现在很容易,”约翰说。 “我不太确定你在这里问我什么。 你看,伦纳德,这不完全在我的驾驶室里。”

他正尽力去体谅他人,但这种做法对他来说有点陌生。

“现在,如果有人谋杀了你的妻子-那将是我的小巷! 我的意思是,从调查的角度来看……那将是……”

约翰使伦纳德陷入痛苦的泥潭。 他开始重建堤防。

“好,抓紧了。”约翰继续说道。 “我很确定我可以解决这个问题。”

面对新近的希望,伦纳德的面容得到了改善。

“谢谢。 谢谢你,一千次! “我不能一次付清所有的钱,但如果您能请……请她去拿钱,确保她还可以。”

约翰盯着他的客人,抢走了皱纹的信封。 他开始翻阅它们,凝视着包含肮脏钞票的公开信。 伦纳德的注意力转移到证据上,使他的话语逐渐消失。 感到满意的是,他把一叠信纸拍在自己的手掌上,形成了一个尖锐的裂缝。 伦纳德的耳朵振作起来。

“我想给你坐一个……”约翰说。 他转身离开伦纳德,言语不清。 和他装扮好客的尝试一样。

“嗯。”约翰咕unt道。 “此戳记:所请求的资源上没有’Access-Control-Allow-Origin’标头。 因此,不允许访问原点。 “

“对!”伦纳德脱口而出。 “每次,每次! 我写了一封信,输入了正确的地址,然后他们继续返回这个错误,无论它是什么!”

约翰无视这种感叹,继续说下去。 他正在检查纸面的剧本。

“果然,”​​他说。 “格式看起来正确-我假设地址正确吗? 关于此的一切看起来都是科斯珀特的。 但是有些东西丢失了……”

约翰沉思了一下,将信封按在嘴唇上。 片刻之后,他转向办公桌,放下信封露出了一个狡猾的假笑。 他伸出手,把死去的雪茄从灰烬中拉出来。 也许还有希望。

“伦纳德。”他开始。 “我知道你的意思很好。 您正在尽最大的努力来完成一份付给花生的工作。 您想为您的家人提供食物,我明白了。 我尊重 但-”

约翰盯着伦纳德。 他举起一封信直到脸上,好像他和他俩都在自鸣得意地凝视着他。

“您错过了一条关键信息。”约翰说。 此时他正在漂流。

“您忘了把您的原始地址放在最前面!”他喊道。 “没有它,邮政局长将拒绝它。 它与安全性有关–“跨源资源共享”或类似的东西。 查一下 同时,将您的血统贴在上面,这样您就很黄金了。”

伦纳德的肚子里传来一阵笑声。 他恢复了镇定。

“谢谢上帝,里奇伯恩!”伦纳德喊道。 “如果我只是放慢脚步并注意……”

“简单的错误。”约翰耸耸肩膀回答。 他的笑容很快变成了令人毛骨悚然的微笑。 他张开双臂,将伦纳德朝出口方向旋转。

“看,我不必离开办公室,”约翰说。 “而且在上次通话之前,我还有很多时间。 让我们跳过文书工作。 离开这里,把钱交给你的妻子。”

伦纳德笑了。 冲出门,他忍不住结结巴巴地赞美。

“ Ridgebone,如果有什么我可以帮助您的-告诉我,在Ajax找到我! 我擅长数字,数据之类的事情。

“好的伦纳德,”约翰说。 “你敢打赌,我会的。 照顾自己。”

带着最后的笑容和有礼貌的微调,约翰将伦纳德放回了那黑暗的走廊。

约翰有目的地转过身,收集了他的大衣和帽子。 他在下一个目标是那个灯泡上的拉锁,他打算实现这一目标。 伸手向上,他观察到一个放错地方的信封爬进了他的外围。 它已经很好地融合到附近的一堆废弃纸中。 令他满意的是,打开它时发现了一些皱巴巴的美元。

“看起来伦纳德毕竟给了我发薪日。”他打趣道。 “也许我会请那个男人喝一杯。”

约翰·里奇伯恩微笑着走了出去,关上了身后那摇摇欲坠的门。

凯文·菲茨杰拉德在Unsplash上​​的照片

案例审查:

与其他许多案例一样,我的第一个“案例”实际上是对一个简单问题的简单解决。 但是,由于缺乏有关该主题的教育,我经历了一个或两个小时徒劳的研究。

首先是背景。 我正在使用codepen.io作为沙箱在freeCodeCamp上进行“构建Wikipedia Viewer”项目。 我当时使用HTML,CSS和JavaScript构建具有两个目的的搜索程序。 一种,从Wikipedia检索随机文章。 第二,使用户能够搜索文章,并在页面上列出这些文章的标题。

我几乎解决了所有细节,但是搜索功能的一个方面使我受阻。 我需要使用Ajax将请求发送到MediaWiki Web服务。 然后,我将收到一个JSON对象,其中包含使搜索功能正常工作所需的所有数据。 我以前在C#中就与API进行过交互,实际上并没有花太多时间。 机制简单,示例很多。 Ajax和Ajax的jQuery实现看起来更加容易。 这是使用jQuery进行Ajax调用的基本模板:

  $ .ajax(url,[{可选设置对象}])); 

通过仔细阅读MediaWiki API文档,我找到了构建URL所需的信息。 从端点开始:

  https://en.wikipedia.org/w/api.php? 

然后将所有搜索参数添加到末尾:

  format = json&action = query&generator = search&prop = extracts&exintro&explaintext&exsentences = 1&gsrsearch = 

我有一个运行正常的查询。 我需要做的就是使用JavaScript将搜索字符串连接到末尾。

所以我需要编写的代码是:

  $ .ajax(url,{成功://构建用于解析JSON并更新我的HTML的函数。}); 

而已。 与C#相比,它比实例化HttpClient和编码异步要容易得多,对吗? 对于我的简单数据请求,所有默认设置都可以使用。 我只需要编写函数代码来解析JSON对象并更新HTML。 我通过将URL插入地址栏中来测试URL,并验证是否从Web服务收到了JSON。

但是,就像其他许多人进入API的头疼世界一样,我一直遇到“ CORS”。 在旅行中,我听说了跨域资源共享。 我知道在使用Ajax请求时需要考虑这一点。 但是,由于我的热心,我没有能力应对(即无知)。

从MDN:

跨域资源共享(CORS)是一种机制,该机制使用其他HTTP标头来使用户代理获得从与当前使用的站点不同的源(域)上的服务器访问选定资源的权限。 用户代理从不同于当前文档来源的域,协议或端口请求资源时,会发出跨域HTTP请求。

换句话说,我需要更改我的Ajax代码以符合Web服务的安全性要求。 以下错误消息进一步说明了这一点:

 无法加载https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&prop=pageimages|extracts&exintro&explaintext&exsentences=1&gsrsearch=bleh:标题上没有'Access-Control-Allow-Origin'标头要求的资源。 因此,不允许访问来源“ https://s.codepen.io”。 

因此,在这一点上,我从一个文档跳到另一个文档。 我正在阅读MDN,MediaWiki API文档和jQuery文档。 而且我也没有什么进展。 最终,我转过身来,戴上故障排除帽。 这就是我所知道的:我有一个非常具体的错误。 我经常看到“起源”一词,因此我有一个很好的关键字开始。 而且,很明显,尝试与Web服务进行交互是我的重点。 因此,我推断我的答案必须存在于MediaWiki API文档中的某个位置。 所以我走了。 在站点搜索“ Origin”一词后,我收到了一个页面名为“ API:跨站点请求”的点击。

瞧,我发现了以下文本行:

通过将“ origin”请求参数设置为“ *”,可以从任何来源发出未经身份验证的CORS请求。

这句话使一切都变得正确。 这是我需要遵循的API定义的安全设置。 我需要做的就是在URL末尾附加“&origin = *”。 突然,我的Ajax调用成功了,并且我掌握了使程序正常工作所需的数据。 案件结案。

结语

这种经历完美地提醒了代码欺骗。 有时,看似复杂的问题往往是一个简单的变相问题。 解决这些问题并不总是需要编写代码,而是要进行有针对性的研究。 一点耐心也有帮助。 而且我绝不认为我浪费了时间。 我了解了许多与Ajax,API以及它们如何相互影响有关的细节。 不要让密集的文档吓倒您-慢点,阅读和重新阅读,并保持开放的态度。

毕竟,通过一个可衡量的参数似乎已经被愚蠢的事情所困扰。 但是,我自己说服了(大多数情况下,我认为,通过我遇到的许多“简单” Ajax示例),解决方案必须是一些复杂的JavaScript代码。 不是。 我太激动了。 如果我花时间将百叶窗取下,那将是一个打开和关闭的案例。

我能说什么 那只是代码侦探的生活。

有时我写故事,有时我写代码。 在 LinkedIn 和 Twitter上 与我联系 !