使用multipart-form-data生成HTTP POST表单而不卷曲

时间:2017-04-28 12:33:58

标签: http-headers multipartform-data

所以我试图在我的嵌入式应用程序中生成HTTP POST表单。但是我收到服务器400错误,表明我的帖子出了问题。 我没有任何类似curl的库,所以我需要从头开始构建帖子。

const static char *post_header = "POST /v1/avs/speechrecognizer/recognize HTTP/1.1\r\n\
Host: access-alexa-na.amazon.com\r\n\
Authorization: Bearer %s\r\n\
Content-Type: multipart/form-data; boundary=BOUNDARY1234\r\n\
Transfer-Encoding: chunked\r\n\
Content-Length: %d\r\n\
\r\n\r\n\
--BOUNDARY1234\r\n\
Content-Disposition: form-data; name=\"metadata\"\r\n\
Content-Type: application/json; charset=UTF-8\r\n\
\r\n\
{\"messageHeader\": {},\"messageBody\": {\"profile\": \"alexa-close-talk\",\"locale\": \"en-us\",\"format\": \"audio/L16; rate=16000; channels=1\"}}\r\n\
\r\n\r\n\
--BOUNDARY1234\r\n\
Content-Disposition: form-data; name=\"audio\"\r\n\
Content-Type: audio/L16; rate=16000; channels=1\r\n\n";

在最后一次" \ n"我有wav标头和有效负载本身。我在wav标头和最后一个请求标头内容之间没有空终止。尽管我已经尝试过,但它似乎没有任何区别。

我的身份验证令牌应该没问题(我已经用curl验证了它)。我已将这些脚本(https://miguelmota.com/blog/alexa-voice-service-with-curl/)和亚马逊文档用作基础。 blogpost有一个脚本,可以生成多部分有效负载,并且它与我的相同(比较二进制转储)。我唯一明显的问号是查询的第一部分:

   "POST /v1/avs/speechrecognizer/recognize HTTP/1.1\r\n\
    Host: access-alexa-na.amazon.com\r\n\
    Authorization: Bearer %s\r\n\
    Content-Type: multipart/form-data; boundary=BOUNDARY1234\r\n\
    Transfer-Encoding: chunked\r\n\
    Content-Length: %d\r\n\
    \r\n\r\n\"

和curl调用特别是--data-binary部分。它应该影响请求正文shomehow吗?

curl -X POST \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: multipart/form-data; boundary=${BOUNDARY}" \
  --data-binary @multipart_body.txt \
  https://access-alexa-na.amazon.com/v1/avs/speechrecognizer/recognize \
  > response.txt

任何想法?我对此感到有点沮丧。

编辑1:只是为了澄清。包含音频数据的数据总大小约为200k字节。令牌的标头大小约为1200字节。我发送1k blob的东西,我在4k左右后得到错误。所以我没有设法在服务器响应错误之前发送整个事情。亚马逊方面的一些类似案例也表明400在这种情况下指向标题的问题。然而,他们没有手动形成帖子,所以我无法在任何地方看到整个事物。

EDIT2: 另外,因为这是分块数据,我想知道它是如何影响这个的?

我的意思是,如果我将标题块分为由--BOUNDARY1234定义的部分和最多512字节,那将如何工作?我的意思是fe:

  

- BOUNDARY1234 \ r \ n \ Content-Disposition:form-data; name = \" metadata \" \ r \ n \ Content-Type:application / json;   charset = UTF-8 \ r \ n \ \ r \ n \ {\" messageHeader \":{},\" messageBody \":   {\" profile \":\" alexa-close-talk \",\" locale \":\" en-us \ " \"格式\&#34 ;:   \"音频/ L16;率= 16000; channels = 1 \"}} \ r \ n \ \ r \ n \ r \ n \

在--BOUNDARY1234之前的传输开始时是否存在块大小,或者" Content-Disposition"或"内容类型"以某种方式影响这个?或者我应该只将块大小添加到二进制有效负载?这里的问题是我的HW的最大发送块是1k。总标头大小约为1,5k。

0 个答案:

没有答案