我正在制作包含API的rails
应用,我希望我的控制器调用这些API而不是处理ActiveRecord
。
我正在使用HTTParty
拨打电话。当我执行以下操作时,它工作正常。
response = HTTParty.get('https://google.com')
但是当我尝试我的API调用时,它继续处理状态,因为浏览器正在发送请求,即使我等了15分钟但它没有呈现任何内容,我看到了rails控制台,但没有任何请求的迹象。
对于我的API调用,我使用的是:
response = HTTParty.get('http://localhost:3000/api/v1/score_sheets/9')
即使我尝试过这个:
response = HTTParty.get('http://0.0.0.0:3000/api/v1/score_sheets/9')
这也是:
response = HTTParty.get('http://127.0.0.1:3000/api/v1/score_sheets/9')
通过浏览器https://localhost:3000/api/v1/score_sheets/9
发出直接请求,这会返回正确的JSON
。
问题:使用此方法向localhost发送请求有什么问题?或任何其他可能的方式吗?
答案 0 :(得分:2)
在开发模式下,您的应用程序的一个实例一次处理一个请求(在生产中,从rails 4开始,默认情况下启用线程安全模式,但这取决于应用程序的部署方式,这可能没有任何效果)。更确切地说,Rack :: Lock中间件一次只能通过一个请求,因此这会影响中间件以下的所有内容
如果在处理请求时仍有其他请求到达,则必须等待第一个请求完成。在您的情况下,这会导致您的代码永远等待:httparty请求只能在当前请求完成时完成,但这只能在httparty请求完成时才会发生。
有多种方法可以解决这个问题,例如:
答案 1 :(得分:1)
如果您处于开发环境中(使用类似WEBrick或瘦身作为服务器),那么它一次只能处理一个请求。
单个Rails流程一次只能处理一个请求。
因此HTTParty
发出的请求将被屏蔽。