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

Indy, TIdHTTP, Wysyłanie danych POST-em

problemy z funkcjonowaniem bibliotek, komponentów itp.

Indy, TIdHTTP, Wysyłanie danych POST-em

Nowy postprzez Mironas » poniedziałek, 26 czerwca 2017, 09:59

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>

[]

Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 409
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 15
Otrzymał podziękowań: 61
System operacyjny: Windows XP
Kompilator: C++Builder XE
Gadu Gadu: 4289125
    WindowsChrome

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

Nowy postprzez Cyfrowy Baron » wtorek, 27 czerwca 2017, 17:51

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();
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4709
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 441
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez Mironas » poniedziałek, 3 lipca 2017, 13:09

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ą.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 409
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 15
Otrzymał podziękowań: 61
System operacyjny: Windows XP
Kompilator: C++Builder XE
Gadu Gadu: 4289125
    WindowsChrome

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

Nowy postprzez Cyfrowy Baron » poniedziałek, 3 lipca 2017, 20:08

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4709
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 441
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez ksiegowy » wtorek, 25 lipca 2017, 16:18

Dokładnie, tak jest jak mówisz.
Avatar użytkownika
ksiegowy
Bladawiec
Bladawiec
 
Posty: 1
Dołączył(a): wtorek, 25 lipca 2017, 16:11
Lokalizacja: Kalisz
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron