Saya mengirim sejumlah parameter ke API menggunakan metode TIdHTTP.Get().

Saya menarik nilai untuk parameter API aktual dari variabel string atau properti komponen Text (seperti ComboBox, misalnya). Semuanya baik-baik saja sampai salah satu dari nilai-nilai itu berisi spasi.

Misalnya, salah satu parameternya adalah bidang nama lengkap (contoh: 'John Smith')

Karena berisi spasi antara nama depan dan belakang, setelah saya mengirimkannya ke API menggunakan metode TIdHTTP.Get(), itu akan memunculkan kesalahan 400 Bad Request dan gagal.

Jika saya menghilangkan spasi dari nilai untuk itu/parameter tertentu, itu berjalan dengan baik.

Kode yang saya gunakan untuk menguji:

httpObject := TIdHTTP.Create;
    
httpObject.HTTPOptions := [hoForceEncodeParams];
httpobject.MaxAuthRetries := 3;
httpObject.ProtocolVersion := pv1_1;
httpObject.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
httpObject.Request.UserAgent := 'Mozilla/3.0 (compatible;Indy Library)';
httpObject.Request.ContentType := 'application/x-www-form-urlencoded; charset=utf-8';
    
URL := 'url string containing the parameters'; //string variable
httpObject.Get(URL);

Dokumentasi API mengatakan:

image

Bagaimana saya bisa mengatasi ini?

Menggunakan Delphi Community Edition (yaitu 10.3) dan komponen Indy yang menyertainya.

1
t1f 25 Mei 2021, 18:47

2 jawaban

Jawaban Terbaik

Anda telah menyatakan bahwa Anda mengirimkan data sebagai Content-Type: application/x-www-form-urlencoded

Format itu tidak memungkinkan spasi. Anda perlu menyandikan dengan benar apa yang Anda kirimkan.

Dua cara Anda dapat melakukan ini:

Dengan Indy:

Encoded := TIdURI.URLEncode(str);

Dengan TNetEncoding

Encoded := TNetEncoding.URL.Encode(str);
2
Rob Lambden 25 Mei 2021, 15:57

Anda mengirim parameter di URL, bukan di badan permintaan, jadi menyetel properti Request.ContentType dan mengaktifkan opsi hoForceEncodeParams sama sekali tidak diperlukan dan dapat diabaikan.

Anda perlu mengkodekan nilai parameter saat Anda membuat URL untuk mengirim permintaan. Anda dapat menggunakan kelas TIdURI untuk itu, misalnya:

uses
  ..., IdHTTP, IdURI;

URL := 'http://server/shipment?param1='+TIdURI.ParamsEncode(value1)+'&param2='+TIdURI.ParamsEncode(value2)...;
httpObject.Get(URL);
3
Remy Lebeau 25 Mei 2021, 16:38