1

I have an ASP.NET MVC Web API and I need to call it using Delphi 6. I am trying to use the Indy components (version 9.0.18), I am using the TIdHttp component.

I am using the REST methods, like POST to add, PUT to update and DELETE to delete the records. I got successfully adding, updating and getting my records, but I couldn't get successfully to call the DELETE method. It raises an error "HTTP/1.1 400 Bad Request".

I tried to debug the Web API, but it appers that the request didn't come, cause it doesn't stop in the breakpoint.

The Indy version that I am using doesn't have the method DELETE, so I tried to use the DoRequest method.

My code:

IdHTTP.DoRequest(hmDelete, 'http://localhost/myapp/api/user/1', nil, nil);

If I make the request using Fiddler it works, so my Web API is working well.

5
  • Sounds like you need to do some debugging. I'd use a tool like Wireshark to inspect the requests. What's your question for Stack Overflow? Commented Feb 16, 2016 at 22:18
  • If I find a way to inspect the requests will help me to undertand the problem. I will try to use the Wireshark. But my question is how to make a DELETE request using Indy components. Does Anyone already do it? Commented Feb 17, 2016 at 10:34
  • The problem is that I need to use an old version on Delphi and Indy, and I can't update. I know newer versions has better support to make REST requests. Commented Feb 17, 2016 at 10:38
  • New Indy versions can be used with Delphi 6 (and 5) Commented Feb 17, 2016 at 16:09
  • You can use Wireshark or Fiddler to compare a working Delete request with the non-working to find the difference Commented Feb 17, 2016 at 16:10

2 Answers 2

2

As an alternative to Indy, I suggest you use "Import Type Library..." from the Project menu, and select "Microsoft XML", the highest version available (I have versions 3 through 6 on the machine I'm currently on). Disable "Generate Component Wrapper", and then use the XMLHTTP component to make REST calls. E.g.:

uses ActiveX, MSXML2_TLB;

var
  r:XMLHTTP;
begin
  CoInitialize(nil);
  r:=CoXMLHTTP.Create;
  r.open('DELETE','http://localhost/myapp/api/user/1',false,'','');
  //r.setRequestHeader(...
  r.send(EmptyParam);
  if r.status=200 then
Sign up to request clarification or add additional context in comments.

6 Comments

It works! Cause I have another question. What is the better version of the MSXML to use? Because I have customers using Windows XP through Windows 10. Which version has the best compatibility?
In theory the XMLHTTP interface declarations have been there since version 3, and the live systems puts your calls through to any msxml2.dll that happens to be there, so with any version since Windows 2000 and IE since 5.5 it should work as expected.
The theory appears to work. I imported the library from MSXML 4.0 and I tested in a virtual machine that doesn't have version 4.0 installed and it works.
could also invoke TWinHttpRequest r:=TWinHttpRequest.Create(self); r.open1('GET','https://.....',false);
where is import type library in delphi 12 ?
|
1

So another answer is simple, use a COM-Object with flexible late binding, example of a REST translate service with language detection in GET or POST, implements in maXbox script:

function getPostTranslateLibre(feedstream: string): string;
var
  Url,API_KEY, source: string;
  jo, locate: TJSONObject;
  httpReq,hr: Olevariant;
  strm: TStringStream;
begin
   httpReq:= CreateOleObject('WinHttp.WinHttpRequest.5.1');
  // Open the HTTPs connection.  
 try              
  hr:= httpReq.Open('POST','https://libretranslate.pussthecat.org/detect', false);
   httpReq.setRequestheader('user-agent',
      'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0');
  httpReq.setRequestheader('content-type','application/x-www-form-urlencoded');  
//httpReq.setRequestheader('X-RapidAPI-Host','nlp-  translation.p.rapidapi.com');   
//httpReq.setRequestheader('X-RapidAPI-Key','...333'); 
          
if hr= S_OK then HttpReq.Send('q='+HTTPEncode(feedstream));
 /// Send HTTP Post Request & get Responses. 

If HttpReq.Status = 200 Then
   result:= HttpReq.responseText
Else result:= 'Failed at getting   response:'+itoa(HttpReq.Status)+HttpReq.responseText;
//writeln('debug response '+HttpReq.GetAllResponseHeaders);     
 finally
  httpreq:= unassigned;  
 end;                  
end; 

1 Comment

the libretranslate is shutdown in the meantime but the code works

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.