所以我试图在我的嵌入式应用程序中生成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。