![]() |
|
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. ![]() 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. 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... Allah razı olsun Muharrem Hocam. Bu aynen çalıştı.. Stream yerine list yapmak gerekiyormuş. teşekkürler. |