使用不同内容类型上传Titanium多部分文件?

时间:2015-05-01 13:46:31

标签: rest post titanium appcelerator

所以我想发布一个期待以下样本请求的Salesforce.com REST api -

    POST /services/data/v33.0/chatter/feed-elements HTTP/1.1
    Authorization: OAuth 00DRR0000000N0g!...
    User-Agent: Jakarta Commons-HttpClient/3.0.1
    Host: instance_name
    Content-Length: 845
    Content-Type: multipart/form-data; boundary=a7V4kRcFA8E79pivMuV2tukQ85cmNKeoEgJgq
    Accept: application/json

    --a7V4kRcFA8E79pivMuV2tukQ85cmNKeoEgJgq
    Content-Disposition: form-data; name="json"
    Content-Type: application/json; charset=UTF-8

    {
       "body":{
          "messageSegments":[
             {
                "type":"Text",
                "text":"Please accept this receipt."
             }
          ]
       },
       "capabilities":{
          "content":{
             "description":"Receipt for expenses",
             "title":"receipt.pdf"
          }
       },
       "feedElementType":"FeedItem",
       "subjectId":"005RR000000DmOb"
    }

    --a7V4kRcFA8E79pivMuV2tukQ85cmNKeoEgJgq
    Content-Disposition: form-data; name="feedElementFileUpload"; filename="receipt.pdf"
    Content-Type: application/octet-stream; charset=ISO-8859-1

    ...contents of receipt.pdf...

    --a7V4kRcFA8E79pivMuV2tukQ85cmNKeoEgJgq--

如您所见,请求的两个部分期望不同的内容类型。

在Titanium中,我有以下代码 -

    xhr.open("POST", postUri);
    xhr.setRequestHeader("Authorization", authHeader);
    xhr.setRequestHeader('enctype', 'multipart/form-data');

    var data2send = {
        json: jsonObj,
        feedElementFileUpload: imageBlob
    };
    xhr.send(data2send);

根据Appcelerator文档和几个在线线程,httpclient应该能够自动设置每个部分,但是,Salesforce API仍然会给出错误消息:

   [{"errorCode":"MISSING_ARGUMENT","message":"Missing required 'subjectId' parameter."}]

我可以确认subjectId中有jsonObj,其内容是正确的。似乎Salesforce正确地将json部分识别为JSON。如何正确设置内容类型?非常感谢。

更新 - 我使用Wireshark捕获请求文本。显然,httpclient没有为Salsforce API期望的json部分设置内容类型。知道怎么设置吗?

POST /services/data/v33.0/chatter/feed-elements HTTP/1.1
Host: mydomain.com
Accept-Language: en-us
User-Agent: Appcelerator Titanium/3.5.1 (iPhone Simulator/8.2; iPhone OS; en_US;)
enctype: multipart/form-data
X-Requested-With: XMLHttpRequest
Accept: */*
Content-Type: multipart/form-data; charset=utf-8; boundary=0xTibOuNdArY_1430987526
Connection: keep-alive
Authorization: Bearer $My_AUTH_CODE
X-Titanium-Id: 8329dd1d-3379-4d7c-955e-120ad1586a2b
Content-Length: 93333
Accept-Encoding: gzip, deflate

--0xTibOuNdArY_1430987526
Content-Disposition: form-data; name="json"

{"feedElementType":"FeedItem","subjectId":"xxxxxxxxxx","body":{"messageSegments":[{"type":"text","text":"test"}]},"capabilities":{"content":{"description":"sdfaadfs","title":"adsfafsd.png"}}}

--0xTibOuNdArY_1430987526
Content-Disposition: form-data; name="feedElementFileUpload";     filename="01430987526.png"
Content-Type: image/png

my file data...

0 个答案:

没有答案