CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Indy, TIdHTTP, Wysyłanie danych POST-em
Strona 1 z 1

Indy, TIdHTTP, Wysyłanie danych POST-em

Nowy postNapisane: poniedziałek, 26 czerwca 2017, 09:59
przez Mironas
Próbuję wysłać dane (w formacie JSON) poprawnie umieszczone w strumieniu strm na zdalny serwer za pomocą:
KOD cpp:     UKRYJ  
String url = "http://xxxxxxxxxxxxxx.com/api";
String response = IdHTTP1->Post(url, strm);
 

W zdarzeniu IdHTTP1_OnWork widzę, że poprawna ilość bajtów jest wysłana.

W odpowiedzi powinienem otrzymać strukturę JSON zawierająca pewne dane. Jednak otrzymuje wyłącznie pustą tablicę [] (tak jakbym serwer nie odebrał żadnych danych).

Autorzy aplikacji serwerowej udostępnili plik HTML do testowania wysyłania danych za pomocą którego wysłanie tego samego zestawu danych powoduje odebranie poprawnej odpowiedzi z serwera. Fragment kodu HTML odpowiedzialnego za wysyłanie wygląda następująco:
Kod: Zaznacz cały
    <form method="post" id="post_json" action="http://xxxxxxxxxxxxxx.com/api" target="_blank">
        <input type="text" name="data" value="" id="post_json_data" />
    </form>

Pytanie - gdzie popełniam błąd?

[EDIT]

Taki sam efekt mam kiedy próbuję wysłać dane w taki sposób:
KOD cpp:     UKRYJ  
  TIdMultiPartFormDataStream* MPFDStream = new TIdMultiPartFormDataStream();
  MPFDStream->AddFile("data", "C:\\Plik01.json", "text");
  String response = IdHTTP1->Post(url, MPFDStream);
 


Natomiast pewien (połowiczny) efekt otrzymuję kiedy wysyłam tak:
KOD cpp:     UKRYJ  
  TStrings* tresc = new TStringList();
  tresc->LoadFromFile("C:\\Plik01.json");///

  TIdMultiPartFormDataStream* MPFDStream = new TIdMultiPartFormDataStream();
  MPFDStream->AddFormField("data", tresc->Text.Trim());

  // Wysylanie
  String response = IdHTTP1->Post(url, MPFDStream);

 

W takim przypadku otrzymuję w odpowiedzi coś takiego (co podobno ma oznaczać 'brak danych' na wejściu):

<b>Warning</b>: Invalid argument supplied for foreach() in <b>/module/Application/src/Application/Controller/ApiController.php</b> on line <b>253</b>

<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /module/Application/src/Application/Controller/ApiController.php:253) in <b>/module/Application/src/Application/Controller/ApiController.php</b> on line <b>282</b>

<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /module/Application/src/Application/Controller/ApiController.php:253) in <b>/module/Application/src/Application/Controller/ApiController.php</b> on line <b>283</b>

<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /module/Application/src/Application/Controller/ApiController.php:253) in <b>/module/Application/src/Application/Controller/ApiController.php</b> on line <b>284</b>

[]


Re: Indy, TIdHTTP, Wysyłanie danych POST-em

Nowy postNapisane: wtorek, 27 czerwca 2017, 17:51
przez Cyfrowy Baron
KOD cpp:     UKRYJ  
IdHTTP1->Connected();
String url = "http://xxxxxxxxxxxxxx.com/api";
String response = IdHTTP1->Post(url, strm, 0); // powinny być 3 argumenty - podaj 0
IdHTTP1->Disconnect();

Re: Indy, TIdHTTP, Wysyłanie danych POST-em

Nowy postNapisane: poniedziałek, 3 lipca 2017, 13:09
przez Mironas
Trzeci argument funkcji Post(...) jest opcjonalny.

Częściowo namierzyłem problem. Okazuje się, że dane docierają na serwer, ale 'połamane' - a dokładnie co 70 znaków wstawione są:
* Znak równości '='
* Znaki końca wiersza CR+LF
Zielonego pojęcia nie mam skąd one się tam biorą.

Re: Indy, TIdHTTP, Wysyłanie danych POST-em

Nowy postNapisane: poniedziałek, 3 lipca 2017, 20:08
przez Cyfrowy Baron
StringList na końcu każdego wiersza ma CR+LF, bo to znak końca linii. Ty poprzez StringList->Text wysyłasz jednak nie pojedyncza linię, lecz całą zawartość listy, czyli wszystkie linie. Tylko po co używasz do tego StrinList skoro wysyłasz całą zawartość wczytaną z pliku? Może masz błędy w pliku JSON, usuń tam łamanie linii, czyli zapisz wszystkie dane w jednym wierszu, bez łamania linii. Nawet gdy wysyłasz poprzez TIdMultiPartFormDataStream a w pliku JSON są łamane linie, to wartości nie będą prawidłowe.

Re: Indy, TIdHTTP, Wysyłanie danych POST-em

Nowy postNapisane: wtorek, 25 lipca 2017, 16:18
przez ksiegowy
Dokładnie, tak jest jak mówisz.