Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
NetHTTPClient post body
#1
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.
Cevapla
#2
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.

function Post(const AURL: string; const ASource: TMultipartFormData; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(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.

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
Cevapla
#4
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.
Cevapla
#5
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?
DelphiCan'dır!
Cevapla
#6
@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;

Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#7
(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.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  unidbgird tek enterde edit ve post ıslemi mehmet07 1 650 05-01-2025, Saat: 15:44
Son Yorum: mehmet07
  RESTRequest Nesnesinde Body içinde JSON Gönderme Hk. pro_imaj 2 1.650 04-06-2023, Saat: 00:47
Son Yorum: pro_imaj
  Rest Servis Body Param Json Post bydelphi 2 2.127 05-12-2022, Saat: 17:05
Son Yorum: bydelphi
  Rest Debugger ile POST işlemi 41linea41 0 863 18-10-2022, Saat: 20:25
Son Yorum: 41linea41
Photo REST API Post ile Token Alma ahmet6513 4 3.769 27-09-2022, Saat: 15:53
Son Yorum: ahmet6513



Konuyu Okuyanlar: 1 Ziyaretçi