我正在考虑如何实现用于搜索的 REST API 端点。在我看来,对于如何实现搜索选项,我有四种选择,每种都有优点和缺点:
为了完整起见,以下是我想到的优点和缺点:
可以就其中哪一个最好进行冗长、细致和固执己见的讨论,但这种讨论不是这个问题的目的。相反,我会问:SEARCH 动词只是晦涩难懂且很少使用,但仍然是官方方法,还是非标准?
我找到了该方法的草案,但没有更多关于它的官方文档。该草案呼应了我上面提出的四难困境中的一些要点。在我看来,该方法仍然只是一个草案,不能称为“标准”,尽管我不太熟悉如何阅读这些文档。
从功能上来说,我想我的问题是:我可以依靠自称符合标准的软件来处理 SEARCH 方法吗?如果他们不处理,我可以诉诸他们声称符合标准来迫使他们处理吗?进一步归结起来,它是一个可靠的动词吗?
我正在编写一个我想成为RESTful的Sinatra Web服务器,但问题是它必须与另一个通过Web套接字进行通信的服务器进行交互.所以,这需要发生:
我确信这不是太复杂,但我有点卡在上面.基本上,如果整个Web套接字逻辑可以包装在单个函数中,那么该函数可以被阻塞,那就是那样.但我不知道如何包装Web套接字逻辑并阻止它.你怎么看?我所得到的简化版本如下.
require 'sinatra'
require 'websocket-client-simple'
get '/' do
ws = WebSocket::Client::Simple.connect(' ws://URL... ')
ws.on :message do
puts 'bar'
end
ws.on :close do
# At this point we need to send an HTTP response back to the client. But how?
end
ws.on :open do
ws.send 'foo'
end
end
Run Code Online (Sandbox Code Playgroud)
编辑
经过深思熟虑后,我意识到这可以通过线程停止和线程唤醒来实现.这感觉相当复杂,我不知道如何正确地使用Ruby,但这是一个想法:
require 'sinatra'
require 'websocket-client-simple'
get '/' do
socketResponse('wss:// ... URL ...')
'Got a response from the web socket server!'
end
def socketResponse(url)
thread = Thread.new …
Run Code Online (Sandbox Code Playgroud) 这是我的settings.py:
from scrapy.log import INFO
BOT_NAME = 'images'
SPIDER_MODULES = ['images.spiders']
NEWSPIDER_MODULE = 'images.spiders'
LOG_LEVEL = INFO
ITEM_PIPELINES = {
"images.pipelines.WritePipeline": 800
}
DOWNLOAD_DELAY = 0.5
Run Code Online (Sandbox Code Playgroud)
这是我的pipelines.py:
from scrapy import Request
from scrapy.pipelines.files import FilesPipeline
class WritePipeline(FilesPipeline):
def get_media_requests(self, item, info):
for url in item["file_urls"]:
yield Request(url)
def item_completed(self, results, item, info):
return item
Run Code Online (Sandbox Code Playgroud)
这是非常标准的,正常的东西。然而这是我的日志中的一行:
2015-06-25 18:16:41 [scrapy] INFO: Enabled item pipelines:
Run Code Online (Sandbox Code Playgroud)
So the pipeline is not enabled. What am I doing wrong here? I've used Scrapy a few times …
我相信要将 Shopify webhook 与 Rails 应用程序集成,Rails 应用程序需要禁用默认verify_authenticity_token
方法,并使用标头实现自己的身份验证X_SHOPIFY_HMAC_SHA256
。Shopify 文档说只使用request.body.read
. 所以,我这样做了:
def create
verify_webhook(request)
# Send back a 200 OK response
head :ok
end
def verify_webhook(request)
header_hmac = request.headers["HTTP_X_SHOPIFY_HMAC_SHA256"]
digest = OpenSSL::Digest.new("sha256")
request.body.rewind
calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, SHARED_SECRET, request.body.read)).strip
puts "header hmac: #{header_hmac}"
puts "calculated hmac: #{calculated_hmac}"
puts "Verified:#{ActiveSupport::SecurityUtils.secure_compare(calculated_hmac, header_hmac)}"
end
Run Code Online (Sandbox Code Playgroud)
Shopify Webhook 定向到正确的 URL,并且路由将其提供给上面显示的控制器方法。但是当我发送测试通知时,输出不正确。两个HMAC不相等,因此未验证。我相当确定问题在于 Shopify 使用整个请求作为身份验证哈希的种子,而不仅仅是 POST 内容。所以,我需要原始的、未受影响的 HTTP 请求,除非我弄错了。
经过至少一个小时的搜索后,这个问题似乎是互联网上唯一有希望的问题。这正是我要问的,并且得到了 30 票赞成的接受答案。但他的回答……很荒谬。它吐出各种难以理解的、乱码的东西。我错过了一些明显的东西吗?
此外,这篇文章似乎表明我正在寻找的东西是不可能的。似乎 Rails 从未收到过纯粹的请求,但在到达 Rails 之前,Rack …