API SurveyQuestionImage.Data字段的正确格式是什么?

时间:2016-07-25 19:30:35

标签: java google-surveys

我正在使用GCS API,尝试使用图像数据创建调查。

我在.Net平台上使用NuGet包Google.Apis.ConsumerSurveys.v2版本1.14.0.564。我可以创建不包含图像数据的调查而没有问题。但是,当我尝试使用图像数据创建调查时,我收到来自API的错误。

我手头有base64编码的png格式图像数据。当src属性设置为

时,我的图像在网页上的IMG标记中正确显示
'data:image/png;base64,<image base64 string>'  

我想将此图像数据发送到API以填充调查图像。我的理解是我需要将Google.Apis.ConsumerSurveys.v2.Data.SurveyQuestionImage对象的Data属性设置为包含图像数据的字符串。我没有成功。

我首先将base64字符串解码为字节数组:

byte[] bytes = Convert.FromBase64String(<image base64 string>);

我尝试将SurveyQuestionImage对象中的Data属性设置为:

image.Data = Encoding.Unicode.GetString(bytes);

这导致API出现此错误:

Google.Apis.Requests.RequestError Invalid value for ByteString: <the Data string>

我也尝试将字节数组转换为十六进制编码的字符串:

StringBuilder sb = new StringBuilder(bytes.Length);
foreach (Byte b in bytes)
{
  sb.Append(b.ToString("X2"));
}
image.Data = sb.ToString();

这导致更有希望的错误:

Google.Apis.Requests.RequestError Invalid Value supplied to API: image_data was bad. Request Id: 579665c300ff05e6c316a09e600001737e3430322d747269616c320001707573682d30372d32322d72313000010112 [400] Errors [ Message[Invalid Value supplied to API: image_data was bad. Request Id: 579665c300ff05e6c316a09e600001737e3430322d747269616c320001707573682d30372d32322d72313000010112] Location[ - ] Reason[INVALID_VALUE] Domain[global] ] 

是否有人知道Data对象的Google.Apis.ConsumerSurveys.v2.Data.SurveyQuestionImage属性的正确格式?

1 个答案:

答案 0 :(得分:2)

数据需要是base64编码的,并且还需要&#34; urlsafe&#34;或&#34;网络安全&#34;取决于您使用的语言。 (分别是python和java)

换句话说,您需要首先进行base64编码:

网络安全编码使用&#39; - &#39;而不是&#39; +&#39;,&#39; _&#39;而不是&#39; /&#39;

希望这有帮助!

对于 c#用户,请查看此技术以制作网络安全b64:

How to achieve Base64 URL safe encoding in C#?

对于 .net 用户,请查看此问题中的评论:

Converting string to web-safe Base64 format

此链接还提供了有关 .net 特定编码选项的详细信息:

http://www.codeproject.com/Tips/76650/Base-base-url-base-url-and-z-base-encoding

要专门回答原始海报,请尝试将此字节数组转换为字符串。

    public static string ToBase64ForUrlString(byte[] input)
    {
        StringBuilder result = new StringBuilder(Convert.ToBase64String(input).TrimEnd('='));
        result.Replace('+', '-');
        result.Replace('/', '_');
        return result.ToString();
    }