Delphi Can
NetHTTPClient post body - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: NetHTTPClient post body (/showthread.php?tid=5451)



NetHTTPClient post body - delphicim - 24-11-2020

Selâmlar,

https://prnt.sc/vpaw1b

Yukarıdaki resim örneğindeki gibi, NetHTTPClient bileşenini kullanarak post işlemini nasıl yapabilirim. Benim kullandığım mevcut metod aşağıdaki gibidir.

{$region ' Function PostGerceklestir(EklenecekVeri:String):String; '}
Function PostGerceklestir(EklenecekVeri:String):String;
var
       VeriRaw, Veri : TStringStream;
begin

       Result:='';

       If Trim(EklenecekVeri)='' Then Exit;

       VeriRaw:=TStringStream.Create(lParamList.ToString, TEncoding.utf8);

       Veri := TStringStream.Create;

       try
               NetHTTPClient1.Accept           :=  'application/json';
               NetHTTPClient1.ContentType      :=  'application/json; charset=utf-8;';
               NetHTTPClient1.UserAgent        :=  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36';
               NetHTTPClient1.AcceptCharSet    :=  'utf-8';
               NetHTTPClient1.AcceptEncoding   :=  '65001';
               NetHTTPClient1.AcceptLanguage   :=  'tr-TR';


               NetHTTPClient1.CustomHeaders['token'] := 'Authorization=Bearer 1AB2B3V3JDD....' ;

               try
                       NetHTTPClient1.Post('http://postsitesi.com', VeriRaw, Veri);
                       Result:=Veri.DataString;
               except
                       On E:Exception Do
                       ShowMessage('#PostGerceklestir.Hata : '+E.Message);
               end;
       finally
               FreeAndNil(VeriRaw);
               FreeAndNil(Veri);
       end;
end;

{$endregion}


Nerede hata yapıyorum acaba ben? 

Teşekkürler.


NetHTTPClient post body - mrmarman - 24-11-2020

Verdiğiniz resim linki bu şekilde.

k6deodtwuziwzgtsqyn3.png

form-data dediğinden yola çıkarak "Content Type" "multipart/form-data" olması gerekmiyor mu ? 

TMultipartFormData oluşturup bunu embarcadero'nun bu linkine verdiği parametre tiplerinden aşağıdaki şekilde bir yapı işinizi görmesi lazım.

Kod:
function Post(const AURL: string; const ASource: TMultipartFormData; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;



Cvp: NetHTTPClient post body - hayalyilmaz43 - 25-11-2020

(24-11-2020, Saat: 22:00)mrmarman Adlı Kullanıcıdan Alıntı: Verdiğiniz resim linki bu şekilde.

k6deodtwuziwzgtsqyn3.png

form-data dediğinden yola çıkarak "Content Type" "multipart/form-data" olması gerekmiyor mu ? 

TMultipartFormData oluşturup bunu embarcadero'nun bu linkine verdiği parametre tiplerinden aşağıdaki şekilde bir yapı işinizi görmesi lazım.

Kod:
function Post(const AURL: string; const ASource: TMultipartFormData; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;

eğer post request içinde dosya gönderiyorsanız, content-type multipart/form-data alır, şöyle yani

POST /upload HTTP/1.1
Content-Length: 428
Content-Type: multipart/form-data; boundary=abcde12345
--abcde12345
Content-Disposition: form-data; name="id"
Content-Type: text/plain
123e4567-e89b-12d3-a456-426655440000
--abcde12345
Content-Disposition: form-data; name="address"
Content-Type: application/json

ancak dosya göndermiyorsanız post ile request atıyorsanız bu durumda, post ile giden parametrelerde form-data olarak gider, şöyle yani;

POST /test/demo_form.php HTTP/1.1
Host: w3schools.com
Port: xx
Content-Type: xx

name1=value1&name2=value2   <-- post ile giden parametreler. (form-data)



şimdi burada isteğin post olarak görünmesi birşeyi değiştirmez,

eğer sunucu tarafında $_POST["var"] şeklinde okursanız, yukarıdaki örnekde form-data alanından değişken okunur,
eğer sunucu tarafında $_GET["var"] şeklinde okursanız, aşağıdaki örnekde POST dan sonraki ?prm=1 kısmından okunur.

get ile parametre göndermek;
POST /test/demo_form.php?prm1=aaa&prm2=ffff HTTP/1.1
Host: w3schools.com
Port: xx
Content-Type: xx



Cvp: NetHTTPClient post body - delphicim - 26-11-2020

Merhaba,

Yanlış ekran ve yanlış ContentType üzerinden gitmişim. Çok özür.

Doğrusu bu şekilde..

https://prnt.sc/vq4xdb

Böyle bir sonucu, postman ile sunucuda başarılı sonuç olarak alıyorum. NetHTTPClient ile hâlâ çözüm bulamadım.

Giden Json

[
   {
      "CategoryCode":"kategorikodu0001",
      "CategoryName":"Maaaaaoda & Aksesuar",
      "IsActive":"1",
      "ParentCode":"0",
      "ListNo":"99",
      "SeoLink":"",
      "SeoTitle":"",
      "SeoKeywords":"",
      "SeoDescription":"",
      "SeoSettingsId":"",
      "FilteringPanel":"",
      "IsProductListPassive":"",
      "ShowInMenu":"",
      "ShowInMobile":"",
      "ShortDesciption":"",
      "ShowCategory":"",
      "ShowProduct":""
   }
]

Kullandığım kod :


{$REGION ' Function VeriEkle(VeriTipi, EklenecekJson:String):String; '}

Function TForm1.VeriEkle(VeriTipi, EklenecekJson:String):String;
var
       Raww, Gelen : TStringStream;
       Url:String;
       s:String;
begin
       Result:='';

       If Trim(VeriAutHorization.Caption)='' Then
       If VeriAuthentication=False Then
       Exit;

       s:='token='+Trim(VeriAutHorization.Caption)+'&data="'+EklenecekJson+'"';

       Raww:=TStringStream.Create(s, TEncoding.utf8);

       Url:='http://tp18366.eticaret.in/rest1/'+VeriTipi;

       Gelen := TStringStream.Create;

       try
               NetHTTPClient1.Accept           :=  'application/json';
               NetHTTPClient1.ContentType      :=  'application/x-www-form-urlencoded;  charset=utf-8;';
               NetHTTPClient1.UserAgent        :=  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36';
               NetHTTPClient1.AcceptCharSet    :=  'utf-8';
               NetHTTPClient1.AcceptEncoding   :=  '65001';
               NetHTTPClient1.AcceptLanguage   :=  'tr-TR';


               //NetHTTPClient1.CustomHeaders['token'] := Trim(VeriAutHorization.Caption);
               //NetHTTPClient1.CustomHeaders['data']  := EklenecekJson;

               try
                       Memo1.Text:='Gelen : '+NetHTTPClient1.Post(Url, Raww, Gelen ).ContentAsString;
               except
                       On E:Exception Do
                       ShowMessage(E.Message);
               end;
       finally
               FreeAndNil(Raww);
               FreeAndNil(Gelen);
       end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
       VeriEkle('category/setCategories', Data.Text);
end;

{$ENDREGION}





Şimdi ki problemim şu :

{
   "success":false,
   "data":[
      
   ],
   "message":[
      {
         "type":2,
         "code":"AUI015",
         "index":0,
         "id":"",
         "subid":"",
         "text":[
            "Geçersiz json (syntax error, malformed JSON)."
         ],
         "errorField":[
            
         ]
      }
   ],
   "summary":""
}

Teşekkürler.


Cvp: NetHTTPClient post body - Fesih ARSLAN - 26-11-2020

Merhaba,
EklenecekJson veri tipi ile gönderdiğiniz JSON'ın, standart JSON formatına uygun olmadığı hatasını alıyorsunuz.
Gönderdiğiniz JSON veriyi  paylaşabilir misiniz?


NetHTTPClient post body - mrmarman - 26-11-2020

@Fesih ARSLAN  katılarak bir de aşağıda verdiğim şekilde bir deneme yapar mısınız...


Function TForm1.VeriEkle(VeriTipi, EklenecekJson:String):String;
var
  slParam : TStringList;
  Url     : String;
begin
  Result:='';

  If Trim(VeriAutHorization.Caption)='' Then
  If VeriAuthentication=False Then
  Exit;

  Url      := 'http://tp18366.eticaret.in/rest1/'+VeriTipi;
  slParam  :=  TStringList.Create;
  try
    slParam.Values['token'] :=  Trim(VeriAutHorization.Caption);
    slParam.Values['data']  :=  EklenecekJson;

    NetHTTPClient1.Accept           :=  'application/json';
    NetHTTPClient1.ContentType      :=  'application/x-www-form-urlencoded;  charset=utf-8;';
    NetHTTPClient1.UserAgent        :=  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36';
    NetHTTPClient1.AcceptCharSet    :=  'utf-8';
    NetHTTPClient1.AcceptEncoding   :=  '65001';
    NetHTTPClient1.AcceptLanguage   :=  'tr-TR';

    Result := NetHTTPClient1.Post( Url, slParam ).ContentAsString;
    Memo1.Text:= 'Gelen : '+ Result;

  finally
    slParam.Free;
  end;
end;





EK olarak :

Eğer Authorization için bir Auth Key gerekiyorsa header'a aşağıdaki benzeri şekilde de eklemeniz lazım gerekecektir.

          NetHTTPClient1.Customheaders['Authorization'] := 'key=' + FAPIKey;




Cvp: NetHTTPClient post body - delphicim - 26-11-2020

(26-11-2020, Saat: 11:35)mrmarman Adlı Kullanıcıdan Alıntı: @Fesih ARSLAN  katılarak bir de aşağıda verdiğim şekilde bir deneme yapar mısınız...


Function TForm1.VeriEkle(VeriTipi, EklenecekJson:String):String;
var
  slParam : TStringList;
  Url     : String;
begin
  Result:='';

  If Trim(VeriAutHorization.Caption)='' Then
  If VeriAuthentication=False Then
  Exit;

  Url      := 'http://tp18366.eticaret.in/rest1/'+VeriTipi;
  slParam  :=  TStringList.Create;
  try
    slParam.Values['token'] :=  Trim(VeriAutHorization.Caption);
    slParam.Values['data']  :=  EklenecekJson;

    NetHTTPClient1.Accept           :=  'application/json';
    NetHTTPClient1.ContentType      :=  'application/x-www-form-urlencoded;  charset=utf-8;';
    NetHTTPClient1.UserAgent        :=  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36';
    NetHTTPClient1.AcceptCharSet    :=  'utf-8';
    NetHTTPClient1.AcceptEncoding   :=  '65001';
    NetHTTPClient1.AcceptLanguage   :=  'tr-TR';

    Result := NetHTTPClient1.Post( Url, slParam ).ContentAsString;
    Memo1.Text:= 'Gelen : '+ Result;

  finally
    slParam.Free;
  end;
end;





EK olarak :

Eğer Authorization için bir Auth Key gerekiyorsa header'a aşağıdaki benzeri şekilde de eklemeniz lazım gerekecektir.

          NetHTTPClient1.Customheaders['Authorization'] := 'key=' + FAPIKey;



Allah razı olsun Muharrem Hocam. Bu aynen çalıştı..  Stream yerine list yapmak gerekiyormuş.

teşekkürler.