从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); 
}