Консольное приложение C# httpWebRequest
Я пытаюсь создать очень простое консольное приложение на C# для публикации некоторых данных в веб-API. Однако, что бы я ни делал, я получаю ошибку в ответе:
responseText "{\" info \ ": {\" status \ ": \" fail \ ", \" error \ ": {\" code \ ": 1000, \" message \ ": \" Недопустимый аргумент из запроса \ строка "}}}"
API http://www.detrack.com/api-documentation/ ищет сообщение как
https://app.detrack.com/api/v1/deliveries/view/all.json?key=dab13cc0094620102d89f06c0e464b7de0782bb979258d3a&json={"дата":"2014-08-29"}
Я знаю, что использование этого в расширении Chrome Advanced Rest возвращает верный результат. Но когда я попробую то же самое через этот консольный код. Я получаю ошибку!
Вот код, который у меня есть в моем консольном приложении.
using System;
using System.Net;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://app.detrack.com/api/v1/deliveries/view/all.json?key=dab13cc0094620102d89f06c0e464b7de0782bb979258d3a&");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "json={\"date\":\"2014-08-28\"}";
Console.WriteLine(json);
streamWriter.Write(json);
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var responseText = streamReader.ReadToEnd();
Console.WriteLine(responseText);
Console.ReadKey();
}
}
}
}
Любая помощь / руководство будет очень признателен
Brendan
2 ответа
Итак, я смотрю на это:
string json = "json={\"date\":\"2014-08-28\"}";
И в соответствии с кратким описанием на detrack это не то, что вы хотите. Они ожидают действительного JSON, а это не так. Вот что вы должны учитывать действительный JSON:
string json = "{\"date\":\"2014-08-28\"}";
Предупреждаю, я не знаю, как ты убегал от кавычек. Я бы сериализовал это по-другому; либо строго типизированный класс или анонимный класс. Анон будет выглядеть так:
string json = JsonConvert.DeserializeObject(new { date = "2014-08-28" });
Оставьте в стороне любые проблемы со временем, часовыми поясами, utc и т. Д., Которые будут правильно сериализовать ваши структуры. Вот неуклюжая программа от linqpad:
void Main()
{
var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { date = "2014-08-28"});
Console.WriteLine(json);
}
>>> {"date":"2014-08-28"}
Вы можете попробовать (непроверенный!) Код ниже.
using System;
using System.Net;
using System.IO;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
var webAddr = "https://app.detrack.com/api/v1/deliveries/create.json";
var httpWebRequest = (HttpWebRequest) WebRequest.Create(webAddr);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
string postData = "key=dab13cc0094620102d89f06c0e464b7de0782bb979258d3a&json={""date"":""2014-08-28""}";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
httpWebRequest.ContentLength = byteArray.Length;
using(var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(byteArray, 0, byteArray.Length);
streamWriter.Flush();
}
var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse();
using(var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
MessageBox.Show(result);
}
}
}
}