1

Spyne ( 「hello world」コードの例) を使用して、データを生成するWeb サービスを作成し、クライアントのブラウザーで JavaScript コードでこのデータを使用しようとしています。json

アドレスに移動するとhttp://localhost:8000/say_hello?name=Dave&times=3、次の出力が得られます。

["Hello, Dave", "Hello, Dave", "Hello, Dave"]

そういうわけで、サーバーには関係ないと思います(期待どおりに動作します)。

次のコードを使用して、この Web サービスからデータを取得します。

<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <script src="jquery-1.11.1.min.js" ></script>
    <script>
    var request_url = 'http://localhost:8000/say_hello?name=Dave&times=3';
    $.ajax( {
      type:'Get',
      url:request_url,
      dataType: "jsonp",                
      crossDomain : true,
      success:function(data) {
    alert(data);
      },
      error: function()
      {
      alert("fail");
      },

    });
  </script>
  </body>
</html>

次に、「失敗」ポップアップが表示されます。

ネットで調べたところ、サーバー側で以下のように設定するしかありませんでした。

Add following header in the server: 

  Header set Access-Control-Allow-Origin *
  1. サーバー側でヘッダー設定を変更する必要がある場合、どうすれば変更できますか?
  2. サーバー側の設定を変更する必要がない場合、正しいクライアント側のコードは何ですか?

編集

Python と JavaScript コードの両方の最新バージョンは次のとおりです。

HTML:

<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <script src="jquery-1.11.1.min.js" ></script>
    <script>
    var request_url = 'http://localhost:8000/say_hello?name=Dave&times=3';
    var jdata = 'none'
    $.ajax( {
      type:'Get',
      url:request_url,
      dataType: "html",                
      crossDomain : true,
      success:function(data) {
    alert(data);
      },
      error: function()
      {
      alert("fail");
      },

    });
</script>
  </body>
</html>

パイソン:

#!/usr/bin/env python
# encoding: utf8

'''
This is a simple HelloWorld example to show the basics of writing a Http api
using Spyne. Here's a sample:

$ curl http://localhost:8000/say_hello?name=Dave\&times=3
["Hello, Dave", "Hello, Dave", "Hello, Dave"]
'''


import logging

from spyne.application import Application
from spyne.decorator import srpc
from spyne.protocol.json import JsonDocument
from spyne.protocol.http import HttpRpc
from spyne.service import ServiceBase
from spyne.model.complex import Iterable
from spyne.model.primitive import UnsignedInteger
from spyne.model.primitive import String
from spyne.server.wsgi import WsgiApplication

class CorsService(ServiceBase):
    origin = '*'

def _on_method_return_object(ctx):
    ctx.transport.resp_headers['Access-Control-Allow-Origin'] = \
                                              ctx.descriptor.service_class.origin

CorsService.event_manager.add_listener('method_return_object',
                                                        _on_method_return_object)


class HelloWorldService(CorsService):

    @srpc(String, UnsignedInteger, _returns=Iterable(String))
    def say_hello(name, times):

        for i in range(times):
            #yield '%s("Hello, %s")' % (callback, name)
            yield {"name": 'Hello (%d): %s' % (i, name), "address": "%d + %d" % (i, i)}


if __name__=='__main__':
    from wsgiref.simple_server import make_server
    logging.basicConfig(level=logging.DEBUG)

    application = Application([HelloWorldService], 'spyne.examples.hello.http',

          in_protocol=HttpRpc(validator='soft'),

          out_protocol=JsonDocument(ignore_wrappers=True),
      )

    wsgi_application = WsgiApplication(application)

    server = make_server('0.0.0.0', 8000, wsgi_application)

    logging.info("listening to http://127.0.0.1:8000")
    logging.info("wsdl is at: http://localhost:8000/?wsdl")

    server.serve_forever()
4

2 に答える 2

4

これをサービス実装の最初の行として追加する必要があります。

ctx.transport.resp_headers['Access-Control-Allow-Origin'] = '*'

ただし、これは非常に煩わしいものになる可能性があるため、適切に実装する方法を次に示します。

class CorsService(ServiceBase):
    origin = '*'

def _on_method_return_object(ctx):
    ctx.transport.resp_headers['Access-Control-Allow-Origin'] = \
                                              ctx.descriptor.service_class.origin

CorsService.event_manager.add_listener('method_return_object', 
                                                        _on_method_return_object)

を使用する代わりに、サービスの親クラスとしてServiceBaseを使用CorsServiceして、CORS ヘッダーを自動的に取得できるようになりました。

また、ワイルドカードを使用する代わりに、Spyne サービスをホストするドメインにのみヘッダー値を設定する方が安全であることに注意してください。

于 2014-07-02T11:29:03.593 に答える