服务器响应options,如何在JSON-RPC服务器上响应HTTP OPTIONS请求

我的JSON-RPC客户端(使用dojo JSON-RPC的浏览器)在myserver.com/12345(Python 2.5,SimpleJSONRPCServer)上向我的JSON-RPC服务器发出JSON-RPC请求(dojo.callRemote).

然后,服务器获取带有标题“OPTIONS / HTTP / 1.1”的HTTP请求,默认情况下它无法处理,因此我为此请求编写了一个自定义处理程序.

来自浏览器的请求标头说:

OPTIONS / HTTP/1.1

Host: myserver:12345

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100214 Linux Mint/8 (Helena) Firefox/3.5.8 (.NET CLR 3.5.30729)

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.7,de;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Origin: http://myserver.com

Access-Control-Request-Method: POST

Access-Control-Request-Headers: x-requested-with

我发送的响应看起来像这样:

HTTP/1.0 200 OK

Server: BaseHTTP/0.3 Python/2.5

Date: Mon, 05 Apr 2010 18:58:34 GMT

Access-Control-Allow-Method: POST

Access-Control-Allow-Headers: POST

Allow: POST

Content-Type: application/json-rpc

Content-length: 0

但在浏览器中我收到以下错误:

我验证了JSON-Service可以从网上访问.

现在的问题是,浏览器(比方说,Firefox)期望响应听众说什么?或者问题可能在其他地方?

解决方法:

标签:python,http,dojo,json-rpc

来源: https://codeday.me/bug/20190627/1300306.html

### 回答1: RPC请求HTTP请求的不同之处在于RPC请求是一种远程过程调用的协议,它可以让计算机上的不同程序之间进行交互,而HTTP请求则是超文本传输协议,是客户端和服务端之间进行通信的一种标准协议。以下是RPC请求的示例代码: ``` const rpc = new RpcClient({ url: 'http://localhost:8080/rpc', username: 'admin', password: 'admin' });rpc.call('add', [1, 2], (err, result) => { if (err) { console.error(err); } else { console.log(result); } }); ``` 以下是HTTP请求的示例代码: ``` const options = { method: 'GET', url: 'http://localhost:8080/api/data', headers: { 'Content-Type': 'application/json' }, body: { foo: 'bar' } };request(options, (err, response) => { if (err) { console.error(err); } else { console.log(response.body); } }); ``` ### 回答2: RPC请求HTTP请求是两种不同的通信协议,它们在实现上有以下几个方面的不同: 1. 通信协议层面: - RPC(远程过程调用)是一种协议,用于实现分布式系统中的进程之间通信。它使用自定义的二进制协议,通过网络传输数据并调用远程方法。 - HTTP(超文本传输协议)是一种通信协议,用于传输超文本和相关资源。它是基于TCP/IP协议的应用层协议。 2. 数据传输格式: - RPC框架通常使用二进制传输,并且支持各种序列化框架,如Protocol Buffers、Thrift等。这种格式可以实现高效的数据传输,因为它们相对较小,且解析速度较快。 - HTTP请求使用文本传输,以JSON或XML等格式来传输数据。这种格式的优点是易读性好,但相对较大,且解析速度相对较慢。 3. 连接方式: - RPC请求通常使用长连接(Keep-Alive)方式,即保持与服务器的连接状态,可以实现多次请求/响应的通信,提高通信效率。 - HTTP请求默认使用短连接方式,每次请求都需要建立和断开连接,对于频繁的请求,会带来较大的通信开销。 4. 通信协议选择: - RPC框架允许根据实际需求选择不同的通信协议,如TCP、UDP等,并可以加密和压缩数据,增加网络安全性和传输效率。 - HTTP请求通常使用HTTP/1.1协议作为基础协议,也可以使用HTTPS协议进行加密传输。 下面是一个示例,演示了使用RPC框架(以gRPC为例)和HTTP请求调用远程方法的差异: ```python # 使用gRPC进行RPC请求的示例代码 import grpc # 定义proto文件中的方法 import helloworld_pb2 import helloworld_pb2_grpc def run_rpc_request(): # 连接RPC服务器 channel = grpc.insecure_channel('localhost:50051') # 创建客户端存根 stub = helloworld_pb2_grpc.GreeterStub(channel) # 调用远程方法 response = stub.SayHello(helloworld_pb2.HelloRequest(name='Alice')) # 输出结果 print("Greeter client received: " + response.message) # 使用HTTP请求调用远程API的示例代码 import requests def run_http_request(): # 发送HTTP请求 response = requests.get('https://api.example.com/hello?name=Alice') # 解析响应数据 data = response.json() # 输出结果 print("API response: " + data['message']) # 调用示例函数 run_rpc_request() run_http_request() ``` 以上示例中,`run_rpc_request()`函数使用gRPC框架发送RPC请求,而`run_http_request()`函数使用HTTP请求调用远程API。两者在实现和使用上都有较大的差异。 ### 回答3: RPC (Remote Procedure Call,远程过程调用) 请求HTTP (Hypertext Transfer Protocol,超文本传输协议) 请求在很多方面有所不同。下面是它们的详细说明。 1. 协议格式:RPC 请求HTTP 请求使用不同的协议格式。RPC 请求通常使用二进制格式,如Protocol Buffers或Thrift,在网络传输中更高效。而HTTP 请求使用明文文本格式。 2. 功能定位:RPC 请求用于调用远程服务的特定函数或方法。它们更加强调服务的函数调用,将请求响应看作远程过程调用的结果。HTTP 请求则更多用于资源访问,如获取网页或执行 CRUD 操作。 3. 通信模型:RPC 使用一对一的通信模型,即一个请求和一个响应之间的点对点通信。HTTP 请求则是基于客户端-服务器模型,客户端发送请求服务器服务器返回响应给客户端。 4. 协议支持:RPC 请求可以使用不同的传输协议,如TCP、UDP或HTTP。而HTTP 请求则完全基于HTTP 协议。 5. 交互方式:RPC 请求通常是同步的,即发送请求后阻塞等待响应返回。HTTP 请求可以是同步的,也可以是异步的,在发送请求后可以继续执行其他操作。 下面是一个简单的示例,展示了使用gRPC(一种常见的RPC框架)发送RPC 请求和使用Node.js发送HTTP 请求的例子: ``` // RPC 请求示例 (使用gRPC) const { GreeterClient } = require('example_grpc_pb'); const { HelloRequest } = require('example_pb'); const client = new GreeterClient('localhost:50051', grpc.credentials.createInsecure()); const request = new HelloRequest(); request.setName('John'); client.sayHello(request, (error, response) => { if (error) { console.error(error); } else { console.log(response.getMessage()); } }); // HTTP 请求示例 (使用Node.js) const http = require('http'); const options = { hostname: 'localhost', port: 3000, path: '/', method: 'GET', }; const req = http.request(options, (response) => { response.on('data', (chunk) => { console.log(`Received data: ${chunk}`); }); response.on('end', () => { console.log('Request finished.'); }); }); req.on('error', (error) => { console.log(`Request error: ${error.message}`); }); req.end(); ``` 总结:RPC 请求HTTP 请求在协议格式、功能定位、通信模型、协议支持和交互方式等方面都存在差异。了解它们的区别有助于选择适合具体需求的通信方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值