Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >谷歌翻译V2无法完成C#的大文本翻译

谷歌翻译V2无法完成C#的大文本翻译
EN

Stack Overflow用户
提问于 2012-02-24 06:32:45
回答 3查看 6.1K关注 0票数 6

我用GET方法使用实现了C#代码。它成功地翻译了小文本,但是当增加文本长度时,需要花费1 800个字符(包括URI参数),我就得到了"URI太大“错误。

好的,我烧毁了所有的路径,并在互联网上的多个页面上对这个问题进行了调查。所有这些人都明确表示GET方法应该被覆盖以模拟POST方法(POST方法是为了提供对5,000个字符URI的支持),但是没有办法找到它的代码示例。

有没有人有任何的例子或可以提供一些信息?

编辑这里是我使用的代码:

代码语言:javascript
运行
AI代码解释
复制
String apiUrl = "https://www.googleapis.com/language/translate/v2?key={0}&source={1}&target={2}&q={3}";
            String url = String.Format(apiUrl, Constants.apiKey, sourceLanguage, targetLanguage, text);
            Stream outputStream = null;

        byte[] bytes = Encoding.ASCII.GetBytes(url);

        // create the http web request
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        webRequest.KeepAlive = true;
        webRequest.Method = "POST";
        // Overrride the GET method as documented on Google's docu.
        webRequest.Headers.Add("X-HTTP-Method-Override: GET");
        webRequest.ContentType = "application/x-www-form-urlencoded";

        // send POST
        try
        {
            webRequest.ContentLength = bytes.Length;
            outputStream = webRequest.GetRequestStream();
            outputStream.Write(bytes, 0, bytes.Length);
            outputStream.Close();
        }
        catch (HttpException e)
        {
            /*...*/
        }

        try
        {
            // get the response
            HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
            if (webResponse.StatusCode == HttpStatusCode.OK && webRequest != null)
            {
                // read response stream 
                using (StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                {
                    string lista = sr.ReadToEnd();

                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TranslationRootObject));
                    MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(lista));
                    TranslationRootObject tRootObject = (TranslationRootObject)serializer.ReadObject(stream);
                    string previousTranslation = string.Empty;

                    //deserialize
                    for (int i = 0; i < tRootObject.Data.Detections.Count; i++)
                    {
                        string translatedText = tRootObject.Data.Detections[i].TranslatedText.ToString();
                        if (i == 0)
                        {
                            text = translatedText;
                        }
                        else
                        {
                            if (!text.Contains(translatedText))
                            {
                                text = text + " " + translatedText;
                            }
                        }
                    }
                    return text;
                }
            }
        }
        catch (HttpException e)
        {
            /*...*/
        }

        return text;
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-24 06:46:34

显然,使用WebClient将无法工作,因为您不能根据需要更改标头,根据文件

注意:如果希望在单个请求中发送更多数据,还可以使用POST调用API。POST正文中的q参数必须小于5K字符。要使用POST,必须使用X-HTTP-Method-Override头来告诉翻译API将请求视为GET (使用X-HTTP-Method-Override: GET)。

您可以使用WebRequest,但是您需要添加X-HTTP-Method-Override头:

代码语言:javascript
运行
AI代码解释
复制
var request = WebRequest.Create (uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("X-HTTP-Method-Override", "GET");

var body = new StringBuilder();
body.Append("key=SECRET");
body.AppendFormat("&source={0}", HttpUtility.UrlEncode(source));
body.AppendFormat("&target={0}", HttpUtility.UrlEncode(target));
 //--
body.AppendFormat("&q={0}", HttpUtility.UrlEncode(text));

var bytes = Encoding.ASCII.GetBytes(body.ToString());
if (bytes.Length > 5120) throw new ArgumentOutOfRangeException("text");

request.ContentLength = bytes.Length;
using (var output = request.GetRequestStream())
{
    output.Write(bytes, 0, bytes.Length);
}
票数 7
EN

Stack Overflow用户

发布于 2015-01-22 08:35:16

被接受的答案似乎过时了。现在,您可以成功地使用WebClient (.net 4.5)将POST转换为google,确保设置X-HTTP-Method-Override头。

这里有一些代码来向您展示如何。

代码语言:javascript
运行
AI代码解释
复制
using (var webClient = new WebClient())
{
    webClient.Headers.Add("X-HTTP-Method-Override", "GET");
    var data = new NameValueCollection() 
    { 
        { "key", GoogleTranslateApiKey }, 
        { "source", "en" }, 
        { "target", "fr"}, 
        { "q", "<p>Hello World</p>" } 
    };
    try
    {
        var responseBytes = webClient.UploadValues(GoogleTranslateApiUrl, "POST", data);
        var json = Encoding.UTF8.GetString(responseBytes);
        var result = JsonConvert.DeserializeObject<dynamic>(json);
        var translation = result.data.translations[0].translatedText;
    }
    catch (Exception ex)
    {
        loggingService.Error(ex.Message);
    }
} 
票数 3
EN

Stack Overflow用户

发布于 2012-02-24 06:43:47

?什么?使用C#发布是很简单的--就在文档中。

代码语言:javascript
运行
AI代码解释
复制
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
{
    // Set type to POST
    request.Method = "POST";

从这里开始,基本地将数据放到fom字段中,放入内容流中。

这不是“模拟post方法”,而是完全按照规范执行post请求。

顺便说一句。json从哪里进来的?你说"in C#“。没有必要用json吗?

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9432422

复制
相关文章
flutter - 如何在SingleChildScrollView中实现非滚动 ListView
我试图在这里实现一个不可滚动的ListView构建器,但似乎找不到解决方法。原因是因为我希望所有内容都是可滚动的,并且我不想在可滚动的父级中拥有可滚动的小部件。
徐建国
2021/08/03
2.5K0
如何在Fortran中调用Python
Python是机器学习领域不断增长的通用语言。拥有一些非常棒的工具包,比如scikit-learn,tensorflow和pytorch。气候模式通常是使用Fortran实现的。那么我们应该将基于Python的机器学习迁移到Fortran模型中吗?数据科学领域可能会利用HTTP API(比如Flask)封装机器学习方法,但是HTTP在紧密耦合的系统(比如气候模式)中效率太低。因此,可以选择直接从Fortran中调用Python,直接通过RAM传递气候模式的状态,而不是通过高延迟的通信层,比如HTTP。
bugsuse
2020/04/21
6.1K0
如何在 Flutter 中设置背景图像【Flutter专题16】
在 Flutter 应用程序中设置背景图像的常用方法是使用DecorationImage. 以下示例包括如何设置Fit 模式、透明度以及在显示键盘时防止图像变化。
徐建国
2021/12/13
12.3K0
如何在 Flutter 中设置背景图像【Flutter专题16】
ES中的api调用测试
SearchRequest可用于与搜索文档、聚合、建议有关的任何操作,还提供请求突出显示结果文档的方法。 
一个风轻云淡
2023/10/15
2630
【Python】如何在VBA中调用Pyt
背景: 已有一个Python脚本实现了部分功能,想使用VBA直接调用Python脚本 Python脚本如下: import time def hello(name): return "Hello, " + name + "!" print hello("World") #延时关闭windows控制台,使得用户可以看到运行结果 time.sleep(150); 方法如下: <pre name="code" class="vb">Sub test() Call Shell("C:\Pyt
py3study
2020/01/09
1.9K0
如何在低版本SDK调用高版本API?
随着Android SDK版本不断的迭代更新,在新的SDK上总是会出现让人眼前一亮非常方便好用的API。但是这些新的API呢在低版本的SDK上是没有的,所以当我们的minSdkVersion的版本低于新API所在的版本时,我们直接使用新API在编译时会出现报错。如果只是想解决编译报错的问题呢,Android给我们提供了两种注解的方式避免编译时报错:
吴延宝
2018/09/10
5K1
flutter - 如何在 dart/flutter 中收听流值
如果流不是广播流,则您只能收听一次。 请参阅此 Medium post 以了解有关 Streams 的更多信息。 收听 stream 时,您需要在 _assetsAudioPlayer.currentPosition 函数中添加您的代码。
徐建国
2021/08/30
1.1K0
如何在 Flutter 中创建自定义图标【Flutter专题22】
Flutter 提供了很多开箱即用的图标,使用这些图标非常容易。但是,您也可以使用自己的图标。您需要的是一个 TTF(True Type Font)文件,其中包含您要使用的图标。生成 TTF 文件的最简单方法是使用 Fluttericon.com。
徐建国
2022/03/30
3.5K0
Flutter:避免在生产代码中调用“print”
在使用新版本的 Flutter(2.5.0 或更高版本)时,如果您调用**print()**函数向控制台输出某些内容,IDE 会向您大喊大叫(这种行为以前没有发生过):
徐建国
2021/11/30
3.4K1
Flutter:避免在生产代码中调用“print”
实战教程:如何在API监控中实现高效报警和通知
因一业务需要,想要对API服务接口添加一些监控,以帮助跟踪应用程序的性能、问题和用户活动等。实现监控的方式有多种多样的方式,以下是一些常用的方法:
用户3578099
2023/09/27
8490
实战教程:如何在API监控中实现高效报警和通知
通过REDIS实现限制API调用次数
在对外提供api接口时,往往需要对api接口进行限制,某些情况下还需要做好防止接口被刷的功能。利用redis的自增计数特性可以很轻易的实现该功能。
程序新视界
2020/07/06
2.2K0
基于Powershell 实现腾讯云 API 调用
虽然腾讯云已经提供了支持多种语言的 SDK,使用起来也非常方便,但是某些环境中没有相关的运行环境使用起来往往带来一些环境准备和合规的成本。PowerShell 作为Windows环境普遍存在脚本环境,如果能够顺利运行云相关API将会非常方便。
用户8856568
2023/01/06
3.3K1
qt调用simsimi api实现小黄鸡
项目地址:https://github.com/racaljk/xiaojianji
racaljk
2019/02/25
8250
如何在Excel中调用Python脚本,实现数据自动化处理
这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作。
朱卫军 AI Python
2022/04/03
3.9K0
如何在Excel中调用Python脚本,实现数据自动化处理
flutter中如何实现deeplink
ios也支持两种,"Universal Links" 和 "Custom URL schemes",两个功能和android类似。
用户1974410
2022/09/20
2.4K0
Flutter中实现延时操作
本文是异步编程的延时策略篇章,在Flutter中实现延时操作有两种方式,一种是通过Future,另一种是通过Timer。
徐建国
2021/10/14
2.8K0
如何在小程序中调用本地接口
如何在小程序中调用本地接口 背景: 随着微信小程序开始公测,我司也拿到了AppID,所以开始了微信小程序的趟坑之旅。 由于现在网上已经有很多的《微信小程序从精通到入门》的教程了,所以就不再重复那些,只是讲一下,在开发的过程中,如何使用本地(开发环境)的接口。 因为小程序的开发文档中写到了,wx.request 中的URL只能是一个https请求,本地一般来讲是不会有https的-.- 所以我们使用Charles代理来实现需求。 前提: 本人认为你现在已经具备以下几个条件: 具有微
贾顺名
2018/04/12
2.8K0
如何在小程序中调用本地接口
Flutter调用平台代码
在前面的文章中我们讲了许多Flutter中的组件和Flutter中的特定操作,但是单单使用Flutter里的组件和方法是不够的。
flyou
2019/08/06
2.2K0
Flutter调用平台代码
Flutter开发·Flutter中动画的实现与使用
Flutter中动画的核心类库是Animation,它并不是一个widget,Animation是一个抽象类,就相当于一个定时器,用来描述当前动画的开始,暂停,以及数值状态,与ui渲染没有任何关系,它不能直接控制ui页面上的组件的样式,组件只能通过获取它的状态来改变ui的状态。
玖柒的小窝
2021/10/07
1.6K0
点击加载更多

相似问题

如何在flutter中调用API?

227

如何在flutter中调用API回调?

41

如何在flutter中实现Agora云录制api?

115

如何在API flutter数据上实现if语句

10

如何在Flutter中缓存API调用的响应?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档