Я пытаюсь перевести с китайского (упрощенного) на английский с помощью Microsoft Translator API.
Пара требований
Я должен использовать HTTP-метод
POST
, а неGET
со строкой запроса, потому что мои запросы превышают лимит URI Microsoft в 15 845 символов (обратите внимание, что это возможно, даже если я использую менее 10 000 символов в случае китайских символов. Причина заключается в том, что строка запроса должна быть закодирована URL-адресом, что значительно увеличивает длину, но она декодируется Microsoft до определения количества символов.Единственный метод перевода HTTP, который позволяет
POST
s, - этоTranslateArrayMethod
, напримерTranslateMethod
разрешает толькоGET
s. К сожалению,TranslateArrayMethod
принимает только XML-документ, поэтому я должен работать с XML.
Ниже приводится пример отправляемого мной XML-документа:
<TranslateArrayRequest>
<AppId/>
<From>es</From>
<Options>
<ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType>
</Options>
<Texts>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<![CDATA[Hola]]>
</string>
</Texts>
<To>en</To>
</TranslateArrayRequest>
Это нормально работает, результат:
<ArrayOfTranslateArrayResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<TranslateArrayResponse>
<From>es</From>
<OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:int>4</a:int>
</OriginalTextSentenceLengths>
<TranslatedText>Hello</TranslatedText>
<TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:int>5</a:int>
</TranslatedTextSentenceLengths>
</TranslateArrayResponse>
</ArrayOfTranslateArrayResponse>
Однако, если я затем добавлю какой-либо китайский символ, например:
<TranslateArrayRequest>
<AppId/>
<From>zh-CHS</From>
<Options>
<ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType>
</Options>
<Texts>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<![CDATA[南]]>
</string>
</Texts>
<To>en</To>
</TranslateArrayRequest>
Получаю странный ответ:
<html>
<body/>
<h1>System.Runtime.Serialization.SerializationException</h1>
<p>Message: There was an error deserializing the object of type Microsoft.MT.MDistributor.V2.TranslateArrayRequest. Unexpected end of file. Following elements are not closed: TranslateArrayRequest. Line 1, position 298.</p>
</html>
Обратите внимание, что я также пытался не использовать экранирование CDATA, но это не помогает. Изменение языка From
тоже не влияет.
Я работаю с Node.js (Javascript), хотя, поскольку это общий HTTP API, я не думаю, что это должно иметь значение.
<?xml ?>
, фактической кодировке, которую вы используете? - person Damien_The_Unbeliever   schedule 15.07.2015<?xml version="1.0" encoding="ISO-8859-1"?>
в начало, и он вернул пустой ответ с кодом состояния 400 и заголовками{"content-length":"0","date":"Wed, 15 Jul 2015 08:41:54 GMT","connection":"close"}
. Фактически, я использую node.js, и событие ответаdata
никогда не запускается, поэтому сервер никогда не отправляет никаких данных - он закрывает соединение без какого-либо ответа, кроме кода состояния 400. - person Tom   schedule 15.07.2015