Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t使用Delphi通过Post打开Microsoft语音识别API_Delphi_Ssl_Https_Speech_Indy10 - Fatal编程技术网

Can';t使用Delphi通过Post打开Microsoft语音识别API

Can';t使用Delphi通过Post打开Microsoft语音识别API,delphi,ssl,https,speech,indy10,Delphi,Ssl,Https,Speech,Indy10,我想在Delphi中使用Indy的TIdHTTP通过HTTPS向Microsoft语音识别API发送Post请求 在Microsofts语音识别API页面上: 他们写道,您应该发送一个HTTP POST请求,如下所示: POST https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed HTTP/1.1 Ac

我想在Delphi中使用Indy的TIdHTTP通过HTTPS向Microsoft语音识别API发送Post请求

在Microsofts语音识别API页面上:

他们写道,您应该发送一个HTTP POST请求,如下所示:

POST     https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed HTTP/1.1
Accept: application/json;text/xml
Content-Type: audio/wav; codec=audio/pcm; samplerate=16000
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
Host: speech.platform.bing.com
Transfer-Encoding: chunked
Expect: 100-continue
我用Delphi XE 10 Indy试试这个

但我曾经得到错误400-错误的请求作为答案

在下面的代码中,我该怎么做

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, csrf, url: String;
  PostStream: TIdMultipartFormDataStream;

  HTTPClient: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;


begin
  url := 'https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed HTTP/1.1';

  HTTPClient := TIdHTTP.Create;
  try
    HTTPClient.Disconnect;
    HTTPClient.AllowCookies := True;
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPClient);
    SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    HTTPClient.IOHandler := SSL;
    HTTPClient.HandleRedirects := true;

    HTTPClient.Request.Accept := 'application/json;text/xml';
    HTTPClient.Request.Method := 'POST';
    HTTPClient.Request.ContentType := 'audio/wav; codec=audio/pcm;   samplerate=16000';

    //-----------------------------------------------------------------------


    PostStream := TIdMultiPartFormDataStream.Create;
    try
      PostStream.AddFormField('Ocp-Apim-Subscription-Key','YOUR_SUBSCRIPTION_KEY');

      PostStream.AddFile('file', 'test.wav');


      Response := HTTPClient.Post(url, PostStream);

      PostStream.Clear;


    finally
     PostStream.Free;
    end;

  finally
    HTTPClient.Free;
  end;
end;

您的
POST
请求没有按照Microsoft文档所述的方式进行设置。最重要的是,您根本不应该使用
TIdMultipartFormDataStream
,因为REST服务器不需要
multipart/formdata
格式的请求。请求的主体应该是实际的WAV文件,而不是其他文件
TIdHTTP
甚至有一个重载
Post()
,专门用于上传一个文件

请尝试以下方法:

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, url: String;
  HTTPClient: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  url := 'https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed';

  HTTPClient := TIdHTTP.Create;
  try
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPClient);
    SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    HTTPClient.IOHandler := SSL;

    HTTPClient.AllowCookies := True;
    HTTPClient.HandleRedirects := true;

    HTTPClient.Request.Accept := 'application/json;text/xml';
    HTTPClient.Request.ContentType := 'audio/wav; codec=audio/pcm; samplerate=16000';
    HTTPClient.Request.CustomHeaders.Values['Ocp-Apim-Subscription-Key'] := 'YOUR_SUBSCRIPTION_KEY';

    Response := HTTPClient.Post(url, 'test.wav');
  finally
    HTTPClient.Free;
  end;
end;

您的
POST
请求没有按照Microsoft文档所述的方式进行设置。最重要的是,您根本不应该使用
TIdMultipartFormDataStream
,因为REST服务器不需要
multipart/formdata
格式的请求。请求的主体应该是实际的WAV文件,而不是其他文件
TIdHTTP
甚至有一个重载
Post()
,专门用于上传一个文件

请尝试以下方法:

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, url: String;
  HTTPClient: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  url := 'https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed';

  HTTPClient := TIdHTTP.Create;
  try
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPClient);
    SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    HTTPClient.IOHandler := SSL;

    HTTPClient.AllowCookies := True;
    HTTPClient.HandleRedirects := true;

    HTTPClient.Request.Accept := 'application/json;text/xml';
    HTTPClient.Request.ContentType := 'audio/wav; codec=audio/pcm; samplerate=16000';
    HTTPClient.Request.CustomHeaders.Values['Ocp-Apim-Subscription-Key'] := 'YOUR_SUBSCRIPTION_KEY';

    Response := HTTPClient.Post(url, 'test.wav');
  finally
    HTTPClient.Free;
  end;
end;

做一些调试。你的代码传输了什么?@David:我应该在代码中伪造什么?做一些调试。你的发帖请求是什么样子的。我正在帮助您学习如何调试。检查您实际发布的内容。这是调试的起点。这个网站的存在并不是为了帮你完成你的工作。如果你看了实际的帖子请求,你会发现它不符合规范。这正是雷米告诉你的。当然,他为你做了工作,给了你代码,现在你有了工作代码,但你什么也没学到。您仍然不知道如何调试。这意味着下次当你陷入困境时,你会回到这里要求其他人编写你的代码。如果你学会了调试,你就能解决你自己的问题。做一些调试。你的代码传输了什么?@David:我应该在代码中伪造什么?做一些调试。你的发帖请求是什么样子的。我正在帮助您学习如何调试。检查您实际发布的内容。这是调试的起点。这个网站的存在并不是为了帮你完成你的工作。如果你看了实际的帖子请求,你会发现它不符合规范。这正是雷米告诉你的。当然,他为你做了工作,给了你代码,现在你有了工作代码,但你什么也没学到。您仍然不知道如何调试。这意味着下次当你陷入困境时,你会回到这里要求其他人编写你的代码。如果你学会了调试,你就能解决自己的问题。你好,雷米,你是最棒的。是的,这个代码很好用。非常感谢。@Ingo:那你为什么不接受雷米的回答呢?你好,雷米,你是最棒的。是的,这个代码很好用。非常感谢。@Ingo:那你为什么不接受雷米的回答呢?