使用 httpwebrequest 调用 ibm watson discovery adddocument api
invoke ibm watson discovery adddocument api using httpwebrequest
我需要将 Watson Discovery 功能集成到现有 windows 使用 visual studio 2015 Framework 4.5 开发的服务应用程序中。
我们无法升级框架版本,因此 nuget 库 ibm.watson 无法正常工作。
我尝试转换这个 curl 命令
curl -X POST -u "{username}":"{password}" -F "file=@c:\temp.json" https://gateway-fra.watsonplatform.net/discovery/api/v1/environments/{environment}/collections/{collection}/documents?version=2017-11-07
进入c#代码:
void test
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string username = "{username}";
string password = "{password}";
string postData = File.ReadAllText(@"c:\temp.json");
string BASE_URL = "https://gateway-fra.watsonplatform.net/discovery/api/";
string url = BASE_URL + "/v1/environments/{environment}/collections/{collection}/documents";
var request = (HttpWebRequest)WebRequest.Create(url);
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
request.Credentials = new NetworkCredential(username, password);
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
catch (WebException wex)
{
HttpWebResponse oHttpWebResponse = (HttpWebResponse)wex.Response;
Encoding oEncoding = Encoding.GetEncoding(1252);
string sEx = string.Empty;
using (StreamReader oStreamReader = new StreamReader(oHttpWebResponse.GetResponseStream(), oEncoding))
{
sEx = oStreamReader.ReadToEnd();
oStreamReader.Close();
}
System.Diagnostics.Debug.WriteLine(sEx);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
但出现此错误:
{
"code": 400,
"error": "The request does not contain a \"file\" part or \"metadata\" part. Include at least one of those parts and resubmit your request."
}
请求添加文件或元数据的方法是什么?
这对我有用:
async Task<string> Upload()
{
string environmentId = "xxx";
string collectionId = "xxx";
string username = "xxx";
string password = "xxx";
string sResult = string.Empty;
string filename = @"c:\temp\watson24.json";
string url = $"https://gateway-fra.watsonplatform.net/discovery/api/v1/environments/{environmentId}/collections/{collectionId}/documents?version=2018-08-01";
FileStream fileStream = new FileStream(filename, FileMode.Open);
HttpContent fileStreamContent = new StreamContent(fileStream);
var credentials = new NetworkCredential(username, password);
var handler = new HttpClientHandler { Credentials = credentials };
using (var client = new HttpClient(handler))
{
using (var formData = new MultipartFormDataContent())
{
formData.Add(fileStreamContent, "file", filename);
var response = await client.PostAsync(url, formData);
if (response.IsSuccessStatusCode)
{
Stream oStream = await response.Content.ReadAsStreamAsync();
using (var reader = new StreamReader(oStream))
{
sResult = reader.ReadToEnd();
reader.Close();
}
}
}
}
fileStream.Close();
return sResult;
}
我需要将 Watson Discovery 功能集成到现有 windows 使用 visual studio 2015 Framework 4.5 开发的服务应用程序中。
我们无法升级框架版本,因此 nuget 库 ibm.watson 无法正常工作。
我尝试转换这个 curl 命令
curl -X POST -u "{username}":"{password}" -F "file=@c:\temp.json" https://gateway-fra.watsonplatform.net/discovery/api/v1/environments/{environment}/collections/{collection}/documents?version=2017-11-07
进入c#代码:
void test
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string username = "{username}";
string password = "{password}";
string postData = File.ReadAllText(@"c:\temp.json");
string BASE_URL = "https://gateway-fra.watsonplatform.net/discovery/api/";
string url = BASE_URL + "/v1/environments/{environment}/collections/{collection}/documents";
var request = (HttpWebRequest)WebRequest.Create(url);
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
request.Credentials = new NetworkCredential(username, password);
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
catch (WebException wex)
{
HttpWebResponse oHttpWebResponse = (HttpWebResponse)wex.Response;
Encoding oEncoding = Encoding.GetEncoding(1252);
string sEx = string.Empty;
using (StreamReader oStreamReader = new StreamReader(oHttpWebResponse.GetResponseStream(), oEncoding))
{
sEx = oStreamReader.ReadToEnd();
oStreamReader.Close();
}
System.Diagnostics.Debug.WriteLine(sEx);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
但出现此错误:
{
"code": 400,
"error": "The request does not contain a \"file\" part or \"metadata\" part. Include at least one of those parts and resubmit your request."
}
请求添加文件或元数据的方法是什么?
这对我有用:
async Task<string> Upload()
{
string environmentId = "xxx";
string collectionId = "xxx";
string username = "xxx";
string password = "xxx";
string sResult = string.Empty;
string filename = @"c:\temp\watson24.json";
string url = $"https://gateway-fra.watsonplatform.net/discovery/api/v1/environments/{environmentId}/collections/{collectionId}/documents?version=2018-08-01";
FileStream fileStream = new FileStream(filename, FileMode.Open);
HttpContent fileStreamContent = new StreamContent(fileStream);
var credentials = new NetworkCredential(username, password);
var handler = new HttpClientHandler { Credentials = credentials };
using (var client = new HttpClient(handler))
{
using (var formData = new MultipartFormDataContent())
{
formData.Add(fileStreamContent, "file", filename);
var response = await client.PostAsync(url, formData);
if (response.IsSuccessStatusCode)
{
Stream oStream = await response.Content.ReadAsStreamAsync();
using (var reader = new StreamReader(oStream))
{
sResult = reader.ReadToEnd();
reader.Close();
}
}
}
}
fileStream.Close();
return sResult;
}