2015-01-28 1 views
0

Я создаю веб-приложение, основанное на Dart (с полимерной структурой, но это не относится к вопросу). Мое приложение взаимодействует с сервером HTTP RESTful.Как настроить Content-Type для каждой части многочастного запроса в Dart?

Проблема в том, что я пытаюсь отправить запрос HTTP-сообщения в multipart, но я не смог найти способ установить «Content-Type» для каждой части тела (, а не для основного HTTP заголовок, который по праву устанавливается дротика в «многочастного/форм-данных»)

Вот простой репро моего запроса 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 в качестве двоичных объектов объекта:

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 (преобразован в Base64 по dart framework?) и не может быть проанализирован сервером.

Как только я использую тип Blob, устанавливается атрибут filename, и сервер также отклоняет запрос.

Любая идея?

Заранее благодарен!

+0

Я не использовал многопрофильные запросы раньше, но mabe это может помочь http://stackoverflow.com/a/22604319/217408 –

+0

Я использую тот же тип кода на стороне клиента, чтобы публиковать данные на базе Java и он работает хорошо. Кажется, это проблема на стороне сервера. –

+0

Спасибо за ваши ответы. @ GünterZöchbauer Объект MultipartRequest имеет два метода добавления «детали» в ваш запрос: поля для добавления «текстовой» части (json/xml ..) и файла для добавления файла. Метод файла позволяет вам определить Content-Type (как показано в примере), но, к сожалению, вы не можете установить его с помощью метода fields. –

ответ

1

Я мог бы найти решение. Трюк состоял в том, чтобы указать имя файла с расширением .json при добавлении blob к форме.

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); 

} 

Однако я до сих пор не знаю, как specifiy Content-Type при использовании текстовой части.

Спасибо всем за вашу помощь!