2013-11-13 6 views
1

Я пытаюсь отправить запрос POST ниже в приложении WinRT.WinRT HttpClient, POST-запрос

http://i.stack.imgur.com/I18Bh.png

Это код я использую:

var pairs = new List<KeyValuePair<string, string>> 
{ 
    new KeyValuePair<string, string>("MinOraPart", "01:00"), 
    new KeyValuePair<string, string>("MaxOraPart", "23:59"), 
    new KeyValuePair<string, string>("TIPOVIS", "FERMATE"), 
    new KeyValuePair<string, string>("CAMBIOCOMUNE", "0"), 
    new KeyValuePair<string, string>("DescLocPart", "PADOVA AUTOSTAZIONE"), 
    new KeyValuePair<string, string>("DescLocDest", "ROVIGO AUTOSTAZIONE"), 
    new KeyValuePair<string, string>("direzione", "ANDATA"), 
    new KeyValuePair<string, string>("gg", ""), 
    new KeyValuePair<string, string>("meseanno", ""), 
    new KeyValuePair<string, string>("ControlloEsisteFermata", "0"), 
    new KeyValuePair<string, string>("PARTENZA", ""), 
    new KeyValuePair<string, string>("LocPartenza", "348|PADOVA AUTOSTAZIONE|0"), 
    new KeyValuePair<string, string>("ARRIVO", ""), 
    new KeyValuePair<string, string>("LocArrivo", "453|ROVIGO AUTOSTAZIONE|0"), 
    new KeyValuePair<string, string>("dataViaggio", "14/11/2013"), 
    new KeyValuePair<string, string>("OREDalSol", "01:00"), 
    new KeyValuePair<string, string>("OREAlSol", "23:59"), 
    new KeyValuePair<string, string>("fascia", "libera"), 
    new KeyValuePair<string, string>("ordine", "NumCambi, OraPart"), 
    new KeyValuePair<string, string>("MaxNodi", "1"), 
    new KeyValuePair<string, string>("MinimoV", "0"), 
    new KeyValuePair<string, string>("CERCA_ANDATA", "corse di ANDATA") 
} 
var content = new StringContent(pairs); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 
var client = new HttpClient(); 
var response = await client.PostAsync("http://ro.autobus.it/ro/asp/RicercaOrari.asp?User=SITA", content); 
if (response.IsSuccessStatusCode) 
{ 
    //Extract the data from the webpage 
} 

Это работает, так как я получаю HTML код с сервера, но страница я Получать не содержит результат запроса, это просто на странице поиска без результатов.

Кажется, что пропустите что-то в запросе, любое предложение?

+0

У вас есть рабочий запрос, чтобы сравнить его? С быстрым взглядом он выглядит нормально ... – WiredPrairie

+0

запрос на скриншоте работает, у меня нет исходного кода страницы. Это полная PostData строка: 'MinOraPart = 16% 3A30 & MaxOraPart = 23% 3A59 & TIPOVIS = FERMATE & CAMBIOCOMUNE = 0 & DesLocPart = PADOVA + AUTOSTAZIONE & DesLocDest = ROVIGO + AUTOSTAZIONE & Direzione = ANDATA & GG = & meseanno = & controlloEsisteFermata = 0 & Partenza = PADOVA + AUTOSTAZIONE & LocPart = 348% 7CPADOVA + AUTOSTAZIONE% 7C0 & ARRIVO = ROVIGO + AUTOSTAZIONE & LocDest = 453% 7CROVIGO + AUTOSTAZIONE% 7C0 & dataViaggio = 20% 2F11% 2F2013 & OREDalSel = 16% 3A30 & OREAlSel = 23% 3A59 & фасции = Libera & Ordine = NumCambi% 2C + OraPart & MaxNodi = 2 & MinimoV = 0 & CERCA_ANDATA = CORSE + ди + ANDATA' – user2989242

+0

Смотрите, если вы может использовать Fiddler для захвата рабочих/нерабочих. Это может быть cookie, HTTP-заголовок и т. Д. Очень сложно отладить этот тип проблемы, если у вас нет источника сервера. – WiredPrairie

ответ

0

Вам не хватает, чтобы преобразовать этот массив пар в percent-encoded string. К сожалению, в WinRT нет класса NameValueCollection. Но выполнять эквивалентную функцию не так уж сложно. Например .:

private string ToPercentEncoding(List<KeyValuePair<string, string>> pairs) 
{ 
    List<string> joinedPairs = new List<string>(); 
    foreach (var pair in pairs) 
    { 
     joinedPairs.Add(
      System.Net.WebUtility.UrlEncode(pair.Key) + 
      "=" + 
      System.Net.WebUtility.UrlEncode(pair.Value)); 
    } 

    return String.Join("&", joinedPairs); 
} 

Затем, просто вызовите функцию из кода и передать результат в StringContent класса:

private async void Foo(){ 
    var pairs = new List<KeyValuePair<string, string>> 
    { 
     new KeyValuePair<string, string>("MinOraPart", "01:00"), 
     new KeyValuePair<string, string>("MaxOraPart", "23:59"), 
     new KeyValuePair<string, string>("TIPOVIS", "FERMATE"), 
     new KeyValuePair<string, string>("CAMBIOCOMUNE", "0"), 
     new KeyValuePair<string, string>("DescLocPart", "PADOVA AUTOSTAZIONE"), 
     new KeyValuePair<string, string>("DescLocDest", "ROVIGO AUTOSTAZIONE"), 
     new KeyValuePair<string, string>("direzione", "ANDATA"), 
     new KeyValuePair<string, string>("gg", ""), 
     new KeyValuePair<string, string>("meseanno", ""), 
     new KeyValuePair<string, string>("ControlloEsisteFermata", "0"), 
     new KeyValuePair<string, string>("PARTENZA", ""), 
     new KeyValuePair<string, string>("LocPartenza", "348|PADOVA AUTOSTAZIONE|0"), 
     new KeyValuePair<string, string>("ARRIVO", ""), 
     new KeyValuePair<string, string>("LocArrivo", "453|ROVIGO AUTOSTAZIONE|0"), 
     new KeyValuePair<string, string>("dataViaggio", "14/11/2013"), 
     new KeyValuePair<string, string>("OREDalSol", "01:00"), 
     new KeyValuePair<string, string>("OREAlSol", "23:59"), 
     new KeyValuePair<string, string>("fascia", "libera"), 
     new KeyValuePair<string, string>("ordine", "NumCambi, OraPart"), 
     new KeyValuePair<string, string>("MaxNodi", "1"), 
     new KeyValuePair<string, string>("MinimoV", "0"), 
     new KeyValuePair<string, string>("CERCA_ANDATA", "corse di ANDATA") 
    }; 

    var content = new StringContent(ToPercentEncoding(pairs)); 
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 
    var client = new HttpClient(); 
    var response = await client.PostAsync("http://localhost", content); 
    if (response.IsSuccessStatusCode) 
    { 
     //Extract the data from the webpage. 
    } 
} 

И это все, остальная часть кода работает, как ожидалось.

UPDATE:

Некоторые из ваших ключей ошибаетесь, это DesLocDest и не DescLocDest.

Вам обязательно нужно установить cookie, по крайней мере, начиная с ASPSESSIONId ....

Если этого недостаточно, попробуйте установить User-Agent и Origin заголовки.

+0

Все еще не работает ... Я даже пробовал с 'var content = new StringContent (postDataString));' где postDataString - это закодированная строка, которую я получаю из Tamper Data (AddOn для Firefox, которая показывает запрос GET/POST) – user2989242

+0

Что именно не работает? Можете ли вы поделиться следами Fiddler запроса и ответа? – kiewic

+0

https: //www.dropbox.com/sh/rfb976p7tsbsc22/8iMvznCxzc – user2989242

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