Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TNetHttpClient post json
#1
Selamlar;
var
 sResponse : String;
 sReq : TStringStream;
 XSO : ISuperObject;
 i,lCode : Integer;
 aItem : ISuperObject;
 Name,SName,TaxOffice,TaxAccNo,IDNO,ACContactName,CType : String;
 IntraGroup,IsCompany : Boolean;
 htp : TNetHTTPClient;
 s : TNetHeaders;
begin
 htp := TNetHTTPClient.Create(Nil);
 Tkn := Memo2.Text;
 sReq := TStringStream.Create(Memo3.Text,TEncoding.UTF8);
 sReq.Position := 0;
 SetLength(s,2);
 s[0].Name := 'Authorization';
 s[0].Value := 'Bearer '+Tkn;
 s[1].Name := 'Content-Type';
 s[1].Value := 'application/json';
 try
   sResponse := htp.Post('htpps://apiadresi','ReqAgency.json',Nil,s).ContentAsString(TEncoding.UTF8);
   sResponse := '{"arr":'+sResponse+'}';
   XSO := SO(sResponse);
 except
   on e:Exception do
   begin
     ShowMessage(e.Message);
   end;

 end;
10.2 tokyo üzerinden tnethttpclient kullanarak yukardaki gibi json verisini post etmeye çalışıyorum. Aynı yapı ile indy'den post edebiliyorum sorun yok fakat TNetHttpClient ile post işlemini bir gerçekleştiremedim.
Yukardaki kod bloğunu çalıştırdığımda 
Error adding header: (87) Parametre hatalı
olarak bir hata dönüyor. Indy'den TNetHttpClient geçme nedenim "can not load ssl library" hatasından kurtulmak.

  htp.CustomHeaders['Authorization'] := 'Bearer '+Tkn;
 htp.CustomHeaders['content-type'] := 'application/json';
custom header'ı yukardaki gibi de yaptım yine aynı hata mesajı geliyor.
İmam Süleyman Yakub <--> Molla Mustafa Mansur
Evlatlarım!
Cismanımız TÜRK ruhumuz ise İSLAM.
Bu yolda daim olalım her an.
Cevapla
#2
Post methodunda TNetHeaders kullanmak isterseniz yapı şu şekilde olmalı:
function Post(const AURL: string; const ASource: TStream; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;

Bilgi için:
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Yani Post'un 2. parametresi TStream olmalı ama sizin kodda öyle gözükmüyor  Exclamation

Post'un şu şekilde de tanımı varmış, görmemişim:
function Post(const AURL: string; const ASourceFile: string; AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;

Dolayısıyla yukarıda belirttiğim tahminim hatalı olmuş, kusura bakmayın.

TNetHeaders'ı oluşturmak şunu deneyebilir misiniz:
s := s + [TNetHeader.Create('Authorization', 'Bearer ' + Tkn)];
s := s + [TNetHeader.Create('Content-Type', 'application/json')];
There's no place like 127.0.0.1
WWW
Cevapla
#3
@SimaWB evet postun birden fazla override methodu var. Bahsettiğiniz haliyle de denedim. Sonuç değişmedi.

Sonra şunu farkettim Authorization için token'ı memo nesnesi içinden alıyordum. Bunu direk pas dosyası içine aldım.
Ve post gerçekleşti. Memo nesnesi içinde özel karakter atamış olduğundan bu problem ortaya çıkmış.
Şunu söylemekte fayda var
htp.CustomHeaders['Authorization'] := 'Bearer '+Tkn;

zinhar çalışmıyor. İlla TNetHeaders ile yapmak lazım. Ya da extradan bir porperty vs.. var setlemek gerekli.

Teşekkürler.
İmam Süleyman Yakub <--> Molla Mustafa Mansur
Evlatlarım!
Cismanımız TÜRK ruhumuz ise İSLAM.
Bu yolda daim olalım her an.
Cevapla
#4
Windows güncellemelerini elden geçirin isterseniz. Şu aralar benim de başımda benzeri problem var idHttp, NetHttpClient ve REST seçeneklerinin üçünü birden tercihe bağladım. Denediğim bir bilgisayarda indy diğerinde nethttpclient çalışıyor. Birisinde de 3 ü de çalışmadı (biraz klasik olacak ama bende üçü de çalışmakta Big Grin Big Grin Big Grin ). Halen incelemedeyim. Kullandığınız yapıda bir terslik bulunmuyor bu arada ama headers parametresini aşağıdaki gibi de kullanabilirsiniz. Ben de gelen cevapları TStringStream tipli bir sınıfa yazdırıyorum ama nil olarak geçebilirsiniz önemli değil.
strStrm.Clear;
htp.Post('htpps://apiadresi','ReqAgency.json',strStrm,[TNameValuePair.Create('Authorization','Bearer '+Tkn),TNameValuePair.Create('Content-Type','application/json')]);
Header parametresindeki TNameValuePair bir Record yapısıdır ve Create metodu sadece bir değişken üretmektedir. Sınıf olmadığı için Free gerektirmez. Kulandığınız bileşen windows kütüphanesine bağlı olabilir bu yüzden güncel https protokolleri için update lerinizi tamamlamanızda fayda var. 2018 başlarında bununla ilgili yüklüce güncelleme verildi windowsa. Ben ise denemelere halen devam etmekteyim.
Cevapla
#5
@sabanakman güncelleme işi benim için çok külfetli olur. Yazılım bir çok ülkede bir çok firma tarafından kullanılıyor. İnşallah sıkıntı çıkmaz. Gerekirse dediğin gibi opsiyonel yaparım.
İmam Süleyman Yakub <--> Molla Mustafa Mansur
Evlatlarım!
Cismanımız TÜRK ruhumuz ise İSLAM.
Bu yolda daim olalım her an.
Cevapla
#6
(14-11-2018, Saat: 09:35)ahmet_sinav Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@sabanakman  güncelleme işi benim için çok külfetli olur. Yazılım bir çok ülkede bir çok firma tarafından kullanılıyor. İnşallah sıkıntı çıkmaz. Gerekirse dediğin gibi opsiyonel yaparım.

Indy için Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. (libeay32.dll, ssleay32.dll) gerekebilir. Aynı dertten müzdarip olduğumdan çoklu tercihi mecburen eklemek zorunda kaldım ama havuza bir bilgi daha katması açısından ilgili sistemin güncelleme durumunu öğrenmek isterim. Güncel değilse güncelleyip deneme imkanı var mıdır? Varsa güncelledikten sonra çalışacak mı? Gibi parametrelerin sonucunu imkan varsa öğrenmek faydalı olabilir. Shy
Cevapla
#7
@sabanakman indy ile gönderim yapabiliyorum sağolsun Indy problemlerinden dolayı bahsettiğin siteyle baya haşır neşir olduk. Bu siteden dağıtılan dll'ler ile güncelleme yapınca open ssll hatasını geçebiliyorum. Şurada Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. konuşuldu kısmen ve tnethttpclient'a geçeceğimi söylemiştim.
Benim derdim tek bir hamlede tek bir güncellemede bu sorunu kökten çözmek. İnşallah bahsettiğin gibi bir sorun oluşmaz.
Bu dll'lerle ilgili şu var en güncel dll değil o sisteme uygun dll'i bulmak önemli misalen win2016 server için çalışan ssl library win2002 serverda çalışmıyor. veya win7'de çalışan win10'da çalışmıyor. Build numarasının bile farkettiği durumlar çok denk geldi. Sırayla dll dosyasını indirip servisi kontrol edip "heaa bu çalışıyor şükür" deyip konuyu kapattım hep. Çözüm mü değil 3 gün sonra o serverda bir güncelleme oluyor yine sorun.
İmam Süleyman Yakub <--> Molla Mustafa Mansur
Evlatlarım!
Cismanımız TÜRK ruhumuz ise İSLAM.
Bu yolda daim olalım her an.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Thumbs Up Json Parse AV Hatası yhackup 0 66 02-09-2019, Saat: 13:27
Son Yorum: yhackup
  XML Json dosyaları ile Çalışma masteryoda 9 1.766 02-08-2019, Saat: 11:20
Son Yorum: TheEAK
  Json Parse Etme faktoral 3 227 01-08-2019, Saat: 08:50
Son Yorum: SimaWB
  Json Free Etmek yhackup 4 474 31-07-2019, Saat: 11:17
Son Yorum: Halil Han Badem
  REST.Json, TJSon.JsonToObject sorunsalı Gürcan 14 1.015 27-05-2019, Saat: 11:33
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi