Консольное приложение 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);

            }
        }
    }
}
Другие вопросы по тегам