【问题标题】:Howto set Content-Type for each part of multi-part request in Dart?如何在 Dart 中为多部分请求的每个部分设置 Content-Type?
【发布时间】:2015-03-27 10:23:59
【问题描述】:

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

问题是我试图在多部分中发送 HTTP Post 请求,但我找不到为正文的每个部分设置“Content-Type”的方法(而不是主要HTTP 标头,由 dart 正确设置为 'multipart/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 被“包装”为一个 blob(通过 dart 框架转换为 Base64?),无法被服务器解析。

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

有什么想法吗?

提前致谢!

【问题讨论】:

  • 我之前没有使用过多部分请求,但这可能对stackoverflow.com/a/22604319/217408有一些帮助
  • 我在客户端使用相同类型的代码将数据发布到 java 后端并且效果很好。好像是服务器端的问题。
  • 感谢您的回答。 @GünterZöchbauer MultipartRequest 对象有两种方法可以将“部分”添加到您的请求中:添加“文本”部分(json / xml ..)的字段和添加文件的文件。 file 方法允许您定义 Content-Type(如示例所示),但遗憾的是您无法使用 fields 方法进行设置。
  • @AlexandreArdhuin 这在服务器端不是问题。由于它同时接受 json 和 xml,它必须能够执行内容协商。他们要求所有前端应用程序指定他们的内容类型(没有默认值)
  • 但是在您的最后一个代码 sn-p 中,Content-Type 很好地为“上下文”部分提供了。所以我不明白你的评论。

标签: rest http dart content-type multipart


【解决方案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。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 2021-10-03
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多