2016-12-01 7 views
3

Dies gibt den Fehlercode 401 oder 500 zurück. Kann mir jemand helfen, wo ich falsch liege?CppRestSDK https-Anfrage funktioniert nicht

http_client client(L"https://oxford-speech.cloudapp.net/token/issueToken/");  
uri_builder query; 
query.append_query(L"grant_type", L"client_credentials");  
query.append_query(L"client_id", L"test-app"); 
query.append_query(L"client_secret", L"<client secret goes here>"); 
query.append_query(L"scope", L"https://speech.platform.bing.com"); 
query.append_query(L"content_type", L"application/x-www-form-urlencoded"); 

http_request msg(methods::POST); 
msg.headers().set_content_type(L"application/x-www-form-urlencoded"); 
msg.set_request_uri(query.to_string()); 

std::wstring str = msg.to_string(); 
return client.request(msg); 
+0

Ich habe Ihr Client-Secret entfernt und Sie möchten es möglicherweise neu generieren. –

+0

Danke. Habe den Grund nicht gefunden, obwohl dieselbe Abfrage in anderen JS-Programmen funktioniert! – ryadav

Antwort

0

Hier ist eine generische JSON-Darstellung einer Anfrage, die beim letzten Mal (Sept. 2016) funktioniert hat. Ihre Anfrage sieht ziemlich anders aus. Extrahiert aus Woundify settings file

{ 
    "name": "BingSpeechToTextService", 
    "classInterface": "BingServices.ISpeechToTextService", 
    "request": { 
    "method": "post", // { "get" | "post" | <custom> } 
    "preferChunkedEncodedRequests": false, 
    "uri": { 
     "scheme": "https", 
     "host": "speech.platform.bing.com", 
     "path": "recognize", 
     "query": "scenarios=smd&appid=D4D52672-91D7-4C74-8AD8-42B1D98141A5&locale={locale}&device.os=wp7&version=3.0&format=json&instanceid=565D69FF-E928-4B7E-87DA-9A750B96D9E3&requestid={guid}" 
    }, 
    "headers": [ 
     { 
     "Name": "Accept", 
     "Accept": "application/json" 
     }, 
     { 
     "Name": "BearerAuthentication", 
     "BearerAuthentication": { 
      "type": "bearer", // { basic | bearer | <custom> } 
      "clientID": "", 
      "clientSecret": "", 
      "scope": "https://speech.platform.bing.com", 
      "uri": "https://oxford-speech.cloudapp.net/token/issueToken", 
      "grant": "grant_type=client_credentials&client_id={clientID}&client_secret={clientSecret}&scope={scope}" 
     } 
     }, 
     { 
     "Name": "Content-Type", 
     "ContentType": "audio/wav; codec=\"audio/pcm\"; samplerate={sampleRate}" 
     } 
    ], 
    "data": { 
     "type": "binary" // { ascii | base64 | binary | json | raw | string | urlencode } 
    } 
    }, 
    "response": { 
    "missingResponse": "whatever", 
    "jsonPath": "results[0].name" 
    } 
}, 
+0

Verwenden Sie Fiddler, um Ihre Anfrage und Antworten zu beobachten. – BSalita

+0

Danke! Seit dem kann ich das Access Token bekommen. Ich werde dieses JS versuchen. – ryadav

0

Bitte beachten Sie, dass es eine einfachere Token-Ausgabe URL heutzutage. Ihr C++ Code wird wie folgt aussehen:

pplx::task<string_t> getToken() 
{ 
    http_client client(L"https://api.cognitive.microsoft.com/sts/v1.0/issueToken"); 
    http_request req(methods::POST); 
    req.headers().add(L"Ocp-Apim-Subscription-Key", YOUR_API_KEY); 
    return client.request(req).then([=](http_response response) -> pplx::task<string_t> 
    { 
     return response.extract_string(true); 
    }); 
} 

Der gesamte Antworttext ist das Zeichen im Gegensatz zu der alten Regelung, die eine JSON-Antwort hatte, die das Token enthielt.

+0

Danke! Ich hatte das gleiche von - https://www.microsoft.com/cognitive-services/en-us/speech-api/documentation/api-reference-rest/bingvoicerecognition bekommen. Es klappt :) – ryadav

1

Vielen Dank. Ich änderte den Code zu folgen und ich bekam das Token!

pplx::task<void> getAccessToken() 
{ 
istream bodyStream; 
http_client client(L"https://api.cognitive.microsoft.com/sts/v1.0/issueToken"); 
http_request req(methods::POST); 
req.headers().add(L"Ocp-Apim-Subscription-Key", L"YOUR_KEY"); 

return client.request(req) 

.then([](http_response response) 
{ 
    if (response.status_code() != status_codes::OK) 
    { 
     return pplx::task_from_result(); 
    } 
    istream bodyStream = response.body(); 
    container_buffer<std::string> inStringBuffer;  
    return bodyStream.read_line(inStringBuffer) 

.then([inStringBuffer](size_t bytesRead) 
{ 
    const std::string &text = inStringBuffer.collection(); 
    std::cout << text; 
}); 

}); 
}; 
Verwandte Themen