1

Мы используем сторонний api kraken.io для оптимизации наших изображений.Как получить данные json post в Webhook

Результаты оптимизированного изображения опубликованы в Webhook.

В своем апи документе говорится: После оптимизации над Кракеном будет POST сообщения для callback_url указанных в запросе в формате application/jsonJSON.

Я использую ngrok, чтобы позволить удаленному webhooks отправить данные на мою машину разработки, используя this статью.

Результаты размещены на Callback URL:

HTTP/1.1 200 OK 

{ 
    "id": "18fede37617a787649c3f60b9f1f280d", 
    "success": true, 
    "file_name": "header.jpg", 
    "original_size": 324520, 
    "kraked_size": 165358, 
    "saved_bytes": 159162, 
    "kraked_url": "http://dl.kraken.io/18/fe/de/37617a787649c3f60b9f1f280d/header.jpg" 
} 

класс для отображения

public class KrakenOptimizedResults 
{ 
public string id { get; set; } 
public bool success { get; set; } 
public string file_name { get; set; } 
public int original_size { get; set; } 
public int kraked_size { get; set; } 
public int saved_bytes { get; set; } 
public string kraked_url { get; set; } 
} 

Метод Действие

[HttpPost] 
public ActionResult OptimizedWebHook() 
{ 

    Request.InputStream.Position = 0; 

    string jsonString = new System.IO.StreamReader(Request.InputStream).ReadToEnd(); 

    KrakenOptimizedResults obj = new JavaScriptSerializer().Deserialize<KrakenOptimizedResults> 
    (jsonString); 


    return Json(obj); 

}  

Но когда я debug получил jsonString в Html Visualizer, он выглядит как key и value пары вместо формата Json.

Полученные результаты не Json форматированные:

file_name=header.jpeg&original_size=118066&kraked_size=102459&saved_bytes=15607 

Я предполагаю, что полученные данные content-type: является application/x-www-form-urlencoded.

Почему я принимаю key и value пар вместо Json-формата? как я могу десериализовать данные Json в asp.net mvc?

ответ

1

Соучредитель https://kraken.io здесь.

В нашей документации есть вопиющее упущение, которое я исправлю сегодня. Чтобы вернуть JSON, вам нужно установить флаг "json": true в запросе. Опущение этого флага или установка "json": false вернет URLEncoded. Пример Curl запрос:

curl http://api.kraken.io/v1/upload -X POST --form data='{"auth":{"api_key":"YOUR_KEY", "api_secret":"YOUR_SECRET"}, "wait": true, "lossy": true, "callback_url": "http://requestb.in/wbhi63wb", "json": true}' --form [email protected] 

Извините за неудобства :-(

+0

Благодарим вас за то, что я не смог установить json: true request, используя ваш .Net/C# 'SDK, поэтому я расширил базовый класс и [здесь] (http://stackoverflow.com/a/42247770/2218697) - это мое решение. Также было бы полезно, если бы метод 'Optimize' принимал параметры' imageUri', 'callbackUrl' и' optimizeRequest'. Сейчас он принимает только 'imageUri',' callbackUrl'. – stom

0

Шаг 1: Создайте страницу aspx. Эта страница должна иметь возможность принимать HTTP-запрос POST. Шаг 2: Добавьте этот код, чтобы получить HTTP POST data.File: Default.aspx.cs Файл: Default.aspx.cs

var reader = new StreamReader(Request.InputStream); 
var json = reader.ReadToEnd(); 

FileStream ostrm; 
StreamWriter writer; 
TextWriter oldOut = Console.Out; 

ostrm = new FileStream(@"C:\logfile4webhook.txt", FileMode.Append, FileAccess.Write); 
writer = new StreamWriter(ostrm); 
Console.SetOut(writer); 
Console.Write(DateTime.Now + " "); 
Console.WriteLine(json.ToString() + " "); 
Console.SetOut(oldOut); 
writer.Close(); 
ostrm.Close(); 

Шаг 3: Создать webhook. Этот код может быть связан с кнопкой на клик event.File: Default.aspx.cs

AuthenticationDetails auth = new ApiKeyAuthenticationDetails("your api key"); 
string listID = ""; 
listID = "your list id"; 
List list = new List(auth, listID); 
List<string> events = new List<string>(); 
events.Add("Update"); 

string postback = list.CreateWebhook(events, "URL", "json"); 

FileStream ostrm; 
StreamWriter writer; 
TextWriter oldOut = Console.Out; 

ostrm = new FileStream(@"C:\logfile4webhook.txt", FileMode.Append, FileAccess.Write); 
writer = new StreamWriter(ostrm); 
Console.SetOut(writer); 
Console.Write(DateTime.Now + " "); 
Console.WriteLine(postback + " "); 
Console.SetOut(oldOut); 
writer.Close(); 
ostrm.Close(); 

Шаг 4: Активировать webhook. Скопируйте этот идентификатор веб-хоста из текстового файла и передайте его ниже кода. файла: Default.aspx.cs

AuthenticationDetails auth = new ApiKeyAuthenticationDetails("your api key"); 
string listID = ""; 
listID = "your list id"; 
List list = new List(auth, listID); 
list.ActivateWebhook("webhook id"); 

Шаг 5: Тест weebhook.File: Default.aspx.cs

AuthenticationDetails auth = new ApiKeyAuthenticationDetails("your api key"); 
string listID = ""; 
listID = "your list id"; 
List list = new List(auth, listID); 
string postback = list.TestWebhook("webhook id").ToString(); 
FileStream ostrm; 
StreamWriter writer; 
TextWriter oldOut = Console.Out; 

ostrm = new FileStream(@"C:\logfile4webhook.txt", FileMode.Append, FileAccess.Write); 
writer = new StreamWriter(ostrm); 
Console.SetOut(writer); 
Console.Write(DateTime.Now + " "); 
Console.WriteLine(postback + " "); 
Console.SetOut(oldOut); 
writer.Close(); 
ostrm.Close(); 

Шаг 6: Deserialize тела объекта JSON. Нам необходимо создать структуру класса на основе данных JSON.Я положил образец JSON здесь и он создал необходимые классы

public class CustomField 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

public class Event 
{ 
    public List<CustomField> CustomFields { get; set; } 
    public string Date { get; set; } 
    public string EmailAddress { get; set; } 
    public string Name { get; set; } 
    public string SignupIPAddress { get; set; } 
    public string Type { get; set; } 
} 

public class RootObject 
{ 
    public List<Event> Events { get; set; } 
    public string ListID { get; set; } 
} 

После того, как вы создали свой класс, добавить код из шага 2 после

var json = reader.ReadToEnd(); 

десериализовать и разобрать JSON.

RootObject myClass = JsonConvert.DeserializeObject (json);

if (myClass != null) 
{ 
    List<Event> t = myClass.Events; 

    string old_email = "", new_email = ""; 
    old_email = t[0].OldEmailAddress; 
    new_email = t[0].EmailAddress; 

    //now you can do your logic with old_email and new_email 
} 
+0

Спасибо, я редактировал мой вопрос и добавил, 'asp.net mvc' его не веб-форму, чтобы быть ясно, и почему вы вывесили большой и не связанный ответ? – stom

0

Я был в состоянии преобразовать строки запроса Key и Value пара в Json формат с помощью this и this поста, есть некоторая задержка для преобразования формы Dictionary в Json, так что если есть лучшие ответы, то не размещать и советы , ниже мое решение.

Действие Метод

[HttpPost] 
public ActionResult OptimizedWebHook() 
{ 

Request.InputStream.Position = 0; 

string data = new System.IO.StreamReader(Request.InputStream).ReadToEnd(); 
var dict = HttpUtility.ParseQueryString(data); 
var json = new JavaScriptSerializer().Serialize(dict.AllKeys.ToDictionary(k => k, k => 
      dict[k])); 

KrakenOptimizedResults obj = new JavaScriptSerializer().Deserialize<KrakenOptimizedResults> 
          (json); 

    return Json(obj); 

} 

ПОЛУЧАТЬ JSON отформатированный оптимизированы результаты Kraken API.

Как уже упоминалось, @ karim79, Чтобы вернуть JSON, вам нужно установить флаг «json»: true в запросе.

As Kraken .Net/C# У SDK не было возможности установить «json»: true, поэтому мне нужно расширить свой базовый класс.

Расширенная база Класс:

public class OptimizeRequestBaseExtended : OptimizeRequestBase, 
IOptimizeUploadRequest, IRequest 
{ 

    public OptimizeRequestBaseExtended(Uri callbackUrl) 
    { 
     CallbackUrl = callbackUrl; 
    } 

    [JsonProperty("callback_url")] 
    public Uri CallbackUrl { get; set; } 

    [JsonProperty("json")] 
    public bool JsonFormat { get; set; } 

} 

Запрос Kraken API:

var callbackUrl = new Uri("http://localhost:0000/Home/OptimizedWebHook"); 

OptimizeRequestBaseExtended settings = new OptimizeRequestBaseExtended(callbackUrl); 

settings.Lossy = true; 
settings.JsonFormat = true; 

var response = client.Optimize(image: image, filename: filename, optimizeRequest: settings); 

Действие Метод

[HttpPost] 
public ActionResult OptimizedWebHook() 
{ 

Request.InputStream.Position = 0; 

string jsonString = new System.IO.StreamReader(Request.InputStream).ReadToEnd(); 


KrakenOptimizedResults obj = JsonConvert.DeserializeObject<KrakenOptimizedResults> 
(jsonString); 

    return Json(obj); 

} 
Смежные вопросы