从Google App脚本发布JSON对象到Watson发现
问题描述:
我正在尝试将我的Google日历和发布日历作为文档发送到通过谷歌脚本进行的watson发现。我的代码看起来像这样。从Google App脚本发布JSON对象到Watson发现
var headers={
"User-Agent": "CreateCalendarListJson",
"Authorization": "Basic " + Utilities.base64Encode(authdata.username+":"+authdata.password)
};
//headers.contentType="application/json";
var parms={"headers":headers};
url=newurl+"/v1/environments/"+discoveryData.environmentID+
"/collections/"+discoveryData.collection_ID+"/documents/?version=2017-09-01";
parms.method="POST";
parms.file={
'value':JSON.stringify(jsonEvent),
'options':{
'filename':jsonEvent.filename,
'contentType':"application/json"
}
}
console.info('discovery add document %s',JSON.stringify(parms));
response=UrlFetchApp.fetch(url,parms);
但是,这会得到一个错误415不支持的媒体类型。尽管application/json是一种支持的类型,我已经相应地设置了contentType。有什么建议么?
的PARMS变量看起来像这样运行UrlFetchApp.Fetch时:
{"headers":
{"User-Agent":"CreateCalendarListJson",
"Authorization":"Basic ZTIyNTEwM............................tHcg=="},
"method":"POST",
"file":{"value":"{\"title\":\"Events 10/13/2017\",\"filename\":\"Events_10_13_2017\",\"text\":[{\"date\":\"10/13/2017\",\"summary\":\"assignment 1\"}]}",
"options":{"filename":"Events_10_13_2017",
"contentType":"application/json"}}}"
答
的问题是,文件沃森发现必须作为一个多部分/格式的数据类型进行传递。以下函数将写入一个json文本(存储在jsonEvent.text中)作为发现文档。将api端点放在'newurl'中,并在'authdata'(json对象)中存储发现用户名和密码,并在'文件名'中为发现文档指定文件名。
function sendtodiscovery(url, jsonEvent, filename,authdata){
var headers={
"User-Agent": "CreateCalendarListJson",
"Authorization": "Basic " + Utilities.base64Encode(authdata.username+":"+authdata.password)
};
var parms={"headers":headers};
var boundary="xxxxxxxx";
parms.method="POST";
var data="--"+boundary+"\r\n"
data += "Content-Disposition: form-data; name=\"file\"; filename=\""+filename+"\"\r\n";
data += "Content-Type: application/json\r\n\r\n";
console.info("data=%s",data);
console.info("event=%s",JSON.stringify(jsonEvent));
var payload=Utilities.newBlob(data).getBytes()
.concat(Utilities.newBlob(JSON.stringify(jsonEvent)).getBytes())
.concat(Utilities.newBlob("\r\n--"+boundary+"--\r\n\r\n").getBytes());
parms.contentType="multipart/form-data; boundary="+boundary;
parms.payload=payload;
//parms.muteHttpExceptions=true;
console.info('discovery add document %s',JSON.stringify(parms));
return UrlFetchApp.fetch(url,parms);
}