如何在Dart中为多部分请求的每个部分设置Content-Type?

时间:2015-01-28 13:35:22

标签: rest http dart content-type multipart

我正在构建一个基于Dart的Web应用程序(使用聚合物框架,但这与问题无关)。我的应用正在与HTTP RESTful服务器进行通信。

问题是我试图在多部分中发送HTTP Post请求,但我找不到设置“内容类型”的方法。对于身体的每个部分(而不是主HTTP标头,这是由dart正确设置为&multi39 / form-data'

以下是我的http请求的简单回复:

import 'dart:html';
import 'dart:convert';

main(){

  print("je suis dans dart");

  Map jsontosend = {
      'business-context-id': "contexte1",
      'metadatas': [
          {"metadata-id" : "nom", "value" : "doe"},
          {"metadata-id" : "prenom", "value" : "john"}],
  };

  FormData form = new FormData();

  form.append("context", JSON.encode(jsontosend));

  HttpRequest.request("www.google.com", method: "POST", sendData: form);

}

这是我的请求有效负载:

Remote Address:127.0.0.1:63342
Request URL:http://localhost:63342/http_test/web/www.google.com
Request Method:POST
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:263
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarym9PvtGzZDKOKiaH1
Host:localhost:63342
Origin:http://localhost:63342
Referer:http://localhost:63342/http_test/web/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.0 (Dart) Safari/537.36
Request Payload
------WebKitFormBoundarym9PvtGzZDKOKiaH1
Content-Disposition: form-data; name="context"

{"business-context-id":"contexte1","metadatas":[{"metadata-id":"nom","value":"doe"},{"metadata-id":"prenom","value":"john"}]}
------WebKitFormBoundarym9PvtGzZDKOKiaH1--

我尝试拨打的服务器无法解析“'上下文'部分原因是没有提供内容类型。

我也尝试过转换'我的json作为blob对象:

import 'dart:html';
import 'dart:convert';

main(){

  print("je suis dans dart");

  Map jsontosend = {
      'business-context-id': "contexte1",
      'metadatas': [
          {"metadata-id" : "nom", "value" : "doe"},
          {"metadata-id" : "prenom", "value" : "john"}],
  };

  FormData form = new FormData();

  Blob blob = new Blob([JSON.encode(jsontosend)], 'application/json', 'native');

  form.appendBlob("context", blob);

  HttpRequest.request("www.google.com", method: "POST", sendData: form);

}

以及相关的有效负载:

Remote Address:127.0.0.1:63342
Request URL:http://localhost:63342/http_test/web/www.google.com
Request Method:POST
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:312
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryjHxHOCKDpsp22rzQ
Host:localhost:63342
Origin:http://localhost:63342
Referer:http://localhost:63342/http_test/web/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.0 (Dart) Safari/537.36
Request Payload
------WebKitFormBoundaryjHxHOCKDpsp22rzQ
Content-Disposition: form-data; name="context"; filename="blob"
Content-Type: application/json


------WebKitFormBoundaryjHxHOCKDpsp22rzQ--

这一次,设置了上下文部分的Content-Type,但我的json被包裹了#39;作为blob(由dart框架转换为Base64?)并且无法由服务器解析。

一旦我使用Blob类型,就会设置 filename 属性,服务器也会拒绝该请求。

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我可以找到解决方案。 诀窍是在将blob附加到表单时指定扩展名为.json的文件名。

import 'dart:html';
import 'dart:convert';

main(){

  Map jsontosend = {
      'business-context-id': "contexte1",
      'metadatas': [
          {"metadata-id" : "nom", "value" : "doe"},
          {"metadata-id" : "prenom", "value" : "john"}],
  };

  FormData form = new FormData();

  Blob blob = new Blob([JSON.encode(jsontosend)], 'application/json', 'native');

  form.appendBlob("context", blob, "whatever.json");

  HttpRequest.request("www.google.com", method: "POST", sendData: form);

}

但是,在使用文本部分时,我仍然不知道如何指定Content-Type。

感谢大家的帮助!