DART& GAE:为什么从飞镖发送的POST方法无法在GAE中进行评估?

时间:2014-08-01 16:55:31

标签: google-app-engine post dart

我有一个Dart代码,用于通过POST方法向我的GAE WepApp2应用程序发送HttpRequest。飞镖代码以chrome执行,由Chrome开发编辑器提供。我在GAE代码中添加了一些标题,以避免客户端出现XHR错误。

dart代码将数据发送到我的GAE应用程序,但我无法使用 self.request.POST.get(“language”))读取数据,并且应用程序永远不会进入 def post(self):部分,但 self.request.body 我可以阅读数据。

你能解释一下并提供一些修正以获得完整的POST兼容代码吗?

镖:

void _saveData() {
    HttpRequest request = new HttpRequest(); // create a new XHR

    // add an event handler that is called when the request finishes
    request.onReadyStateChange.listen((_) {
      if (request.readyState == HttpRequest.DONE &&
          (request.status == 200 || request.status == 0)) {
        // data saved OK.
        print(request.responseText);
      }
    });

    // POST the data to the server
    var url = "http://127.0.0.1:8080/savedata";
    request.open("POST", url, async: false);

    String jsonData = JSON.encode({"language":"dart"});
    request.send(jsonData);
  }

我的处理程序中的GAE代码:

  def savedata(self):
    logging.info("test")
    logging.info(self.request.body)
    logging.info(self.request.POST.get("language"))
    def post(self):
      logging.info("test 2")
      logging.info(self.request.POST.get("language"))

    self.response.headers["Access-Control-Allow-Origin"] = "http://127.0.0.1:49981"
    self.response.headers["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"

1 个答案:

答案 0 :(得分:1)

在Dart中,如果您没有指定 request.setRequestHeader(&#34; Content-Type&#34;,&#34; application / x-www-form-urlencoded&#34;)< / strong>在你的HttpRequest中,GAE认为数据就像一个咬合流,你只能用 self.request.body

来阅读它们。

如果在Dart中添加Content-Type标头,则还需要更改数据格式。在我的情况下,我模仿使用POST方法发送的表单,因此我更改字符串jsonData = JSON.encode({&#34;语言&#34;:&#34; dart&#34;}); by 字符串jsonData =&#34;语言= dart2&#34;;

IN GAE python我现在可以用 self.request.POST.get(&#34;语言&#34;)

读取数据

如果您需要从DART向GAE发送JSON,您可以对字符串进行编码,如下所示:

String jsonData = JSON.encode({"test":"valuetest1"});
String datas = "datas=$jsonData";
request.send(datas);

在GAE中你可以读取这样的数据:

my_json = json.loads(self.request.POST.get("datas"))
logging.info(my_json["test"])

完整的代码:

<强>达特

void _saveData2() {
    String url = "http://127.0.0.1:8080/savedata";
    HttpRequest request = new HttpRequest() 
      ..open("POST", url, async: true)
      ..setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
      ..responseType = "arraybuffer";

    String jsonData = JSON.encode({"test":"valuetest1"});
    String datas = "datas=$jsonData";
    request.send(datas);
  }

<强> GAE

class PageHandler(webapp2.RequestHandler):

  def savedata(self):

    self.response.headers.add_header('Access-Control-Allow-Origin', '*')
    self.response.headers['Content-Type'] = 'application/json'

    #logging.info(self.request)
    my_json = json.loads(self.request.POST.get("datas"))
    logging.info(my_json["test"])