How to HTTP post in Dot Net

Roelof
Member Posts: 377
I have a few lines of code using automations.
I would like to change the code by using dot net functionality but I'm having difficulties figuring out which dotnet class(es) I need to use.
The code is basically trying to do an http post and replying on the response.
How would the code look like using dot net and which classes would I use?
//--- Start
//XmHttp is using: ''Microsoft XML, v6.0'.XMLHTTP'.
//XmlDoc is using: 'Microsoft XML, v6.0'.DOMDocument
//CurrNode is using: 'Microsoft XML, v6.0'.IXMLDOMNode
CREATE(XmlHttp);
XmlHttp.open('POST',WebServiceURL,FALSE);
XmlHttp.setRequestHeader('Content-Type','text/xml');
XmlHttp.setRequestHeader('SOAPAction','"http://tempuri.org/' + WebFunc + '"');
XmlHttp.send(XMLDoc);
CLEAR(XMLDoc);
CREATE(XMLDoc);
XMLDoc.load(XmlHttp.responseXML);
IF XmlHttp.status <> 200 THEN BEGIN
ErrorNote := 'HTTP ' + FORMAT(XmlHttp.status) + ': ' + XmlHttp.statusText;
EXIT(FALSE);
END;
CurrNode := XMLDoc.documentElement.selectSingleNode('soap:Body/' + WebFunc + 'Response/' + WebFunc + 'Result');
IF NOT ISCLEAR(CurrNode) THEN BEGIN
ReturnMessage := CurrNode.text;
IF STRPOS(ReturnMessage,'Success') > 0 THEN
EXIT(TRUE);
END;
ErrorNote := COPYSTR(ReturnMessage,1,MAXSTRLEN(ErrorNote));
EXIT(FALSE);
//--- End
I would like to change the code by using dot net functionality but I'm having difficulties figuring out which dotnet class(es) I need to use.
The code is basically trying to do an http post and replying on the response.
How would the code look like using dot net and which classes would I use?
//--- Start
//XmHttp is using: ''Microsoft XML, v6.0'.XMLHTTP'.
//XmlDoc is using: 'Microsoft XML, v6.0'.DOMDocument
//CurrNode is using: 'Microsoft XML, v6.0'.IXMLDOMNode
CREATE(XmlHttp);
XmlHttp.open('POST',WebServiceURL,FALSE);
XmlHttp.setRequestHeader('Content-Type','text/xml');
XmlHttp.setRequestHeader('SOAPAction','"http://tempuri.org/' + WebFunc + '"');
XmlHttp.send(XMLDoc);
CLEAR(XMLDoc);
CREATE(XMLDoc);
XMLDoc.load(XmlHttp.responseXML);
IF XmlHttp.status <> 200 THEN BEGIN
ErrorNote := 'HTTP ' + FORMAT(XmlHttp.status) + ': ' + XmlHttp.statusText;
EXIT(FALSE);
END;
CurrNode := XMLDoc.documentElement.selectSingleNode('soap:Body/' + WebFunc + 'Response/' + WebFunc + 'Result');
IF NOT ISCLEAR(CurrNode) THEN BEGIN
ReturnMessage := CurrNode.text;
IF STRPOS(ReturnMessage,'Success') > 0 THEN
EXIT(TRUE);
END;
ErrorNote := COPYSTR(ReturnMessage,1,MAXSTRLEN(ErrorNote));
EXIT(FALSE);
//--- End
Roelof de Jonghttp://www.wye.com
0
Comments
-
BJECT Codeunit 50001 Inbox WebService
{
OBJECT-PROPERTIES
{
Date=17.08.12;
Time=10:05:02;
Modified=Yes;
Version List=Dynamics.is;
}
PROPERTIES
{
OnRun=BEGIN
END;
}
CODE
{
VAR
Text001@1100408000 : TextConst 'ENU=IC Partner Code %1 not found;ISL=Mf. félagakóti %1 finnst ekki';
Text002@1100408001 : TextConst 'ENU=Responsibility Center Code mismatch;ISL=Ábyrgðastöðvarkóti stemmir ekki';
Convert@1100408004 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Convert";
DocumentFile@1100408003 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.File";
Bytes@1100408010 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
MemoryStream@1100408008 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
FileMgt@1100408009 : Codeunit 419;
TempFile@1100408007 : File;
TempFileName@1100408006 : Text[1024];
InStr@1100408002 : InStream;
OutStr@1100408005 : OutStream;
Text003@1100408011 : TextConst 'ENU=No data received;ISL=Engin gögn móttekin';
Text004@1100408012 : TextConst 'ENU=Transaction no. %1 is already imported;ISL=Færsla nr. %1 er þegar innflutt';
PROCEDURE LoadTransaction@1100408001(FromPartnerCode@1100408004 : Code[10];FromRespCenterCode@1100408005 : Code[10];ToPartnerCode@1100408006 : Code[10];ToRespCenterCode@1100408007 : Code[10];Transaction@1100408000 : BigText;PDFInvoice@1100408001 : BigText;PDFDetails@1100408002 : BigText;XMLInvoice@1100408003 : BigText;VAR ResponseMessage@1100408009 : Text[1024]) Success : Boolean;
VAR
ICPartner@1100408010 : Record 413;
TempBlob@1100408024 : TEMPORARY Record 99008535;
TempICOutboxTrans@1100408020 : TEMPORARY Record 414;
TempICOutBoxJnlLine@1100408019 : TEMPORARY Record 415;
TempICIOBoxJnlDim@1100408018 : TEMPORARY Record 423;
TempICOutBoxSalesHdr@1100408017 : TEMPORARY Record 426;
TempICOutBoxSalesLine@1100408016 : TEMPORARY Record 427;
TempICOutBoxPurchHdr@1100408015 : TEMPORARY Record 428;
TempICOutBoxPurchLine@1100408014 : TEMPORARY Record 429;
TempICDocDim@1100408013 : TEMPORARY Record 442;
ICInboxTransaction@1100408022 : Record 418;
ICInboxTransaction2@1100408032 : Record 418;
ICInboxJnlLine@1100408030 : Record 419;
ICInboxSalesHdr@1100408029 : Record 434;
ICInboxSalesLine@1100408028 : Record 435;
ICInboxPurchHdr@1100408027 : Record 436;
ICInboxPurchLine@1100408026 : Record 437;
ICInboxJnlLineDim@1100408025 : Record 423;
ICInboxDocDim@1100408023 : Record 442;
ICInboxOutboxMgt@1100408021 : Codeunit 427;
FromICPartnerCode@1100408012 : Code[20];
ToICPartnerCode@1100408011 : Code[20];
ICOutboxExportXML@1100408008 : XMLport 12;
NewTableID@1100408031 : Integer;
BEGIN
IF NOT ICPartner.GET(FromPartnerCode) THEN BEGIN
ResponseMessage := Text001;
EXIT(FALSE);
END;
IF ICPartner."Responsibility Center" <> FromRespCenterCode THEN BEGIN
ResponseMessage := Text002;
EXIT(FALSE);
END;
IF Transaction.LENGTH > 0 THEN BEGIN
Bytes := Convert.FromBase64String(Transaction);
MemoryStream := MemoryStream.MemoryStream(Bytes);
TempBlob.Blob.CREATEOUTSTREAM(OutStr);
MemoryStream.WriteTo(OutStr);
TempBlob.Blob.CREATEINSTREAM(InStr);
ICOutboxExportXML.SETSOURCE(InStr);
ICOutboxExportXML.IMPORT;
ICOutboxExportXML.GetICOutboxTrans(TempICOutboxTrans);
ICOutboxExportXML.GetICOutBoxJnlLine(TempICOutBoxJnlLine);
ICOutboxExportXML.GetICIOBoxJnlDim(TempICIOBoxJnlDim);
ICOutboxExportXML.GetICOutBoxSalesHdr(TempICOutBoxSalesHdr);
ICOutboxExportXML.GetICOutBoxSalesLine(TempICOutBoxSalesLine);
ICOutboxExportXML.GetICOutBoxPurchHdr(TempICOutBoxPurchHdr);
ICOutboxExportXML.GetICOutBoxPurchLine(TempICOutBoxPurchLine);
ICOutboxExportXML.GetICSalesDocDim(TempICDocDim);
ICOutboxExportXML.GetICSalesDocLineDim(TempICDocDim);
ICOutboxExportXML.GetICPurchDocDim(TempICDocDim);
ICOutboxExportXML.GetICPurchDocLineDim(TempICDocDim);
FromICPartnerCode := ICOutboxExportXML.GetFromICPartnerCode;
ToICPartnerCode := ICOutboxExportXML.GetToICPartnerCode;
ICInboxTransaction2.SETRANGE("Transaction No.",TempICOutboxTrans."Transaction No.");
ICInboxTransaction2.SETRANGE("IC Partner Code",FromICPartnerCode);
ICInboxTransaction2.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
IF ICInboxTransaction2.FINDFIRST THEN BEGIN
ResponseMessage := STRSUBSTNO(Text004,TempICOutboxTrans."Transaction No.");
EXIT(FALSE);
END;
IF TempICOutboxTrans.FIND('-') THEN BEGIN
ICInboxOutboxMgt.OutboxTransToInbox(TempICOutboxTrans,ICInboxTransaction,FromICPartnerCode);
TempICOutBoxJnlLine.SETRANGE("Transaction No.",TempICOutboxTrans."Transaction No.");
TempICOutBoxJnlLine.SETRANGE("IC Partner Code",TempICOutboxTrans."IC Partner Code");
TempICOutBoxJnlLine.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
IF TempICOutBoxJnlLine.FIND('-') THEN
REPEAT
ICInboxOutboxMgt.OutboxJnlLineToInbox(ICInboxTransaction,TempICOutBoxJnlLine,ICInboxJnlLine);
TempICIOBoxJnlDim.SETRANGE("Transaction No.",TempICOutboxTrans."Transaction No.");
TempICIOBoxJnlDim.SETRANGE("IC Partner Code",TempICOutboxTrans."IC Partner Code");
TempICIOBoxJnlDim.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
TempICIOBoxJnlDim.SETRANGE("Line No.",ICInboxJnlLine."Line No.");
IF TempICIOBoxJnlDim.FIND('-') THEN
REPEAT
ICInboxOutboxMgt.OutboxJnlLineDimToInbox(
ICInboxJnlLine,TempICIOBoxJnlDim,ICInboxJnlLineDim,DATABASE::"IC Inbox Jnl. Line");
UNTIL TempICIOBoxJnlDim.NEXT = 0;
UNTIL TempICOutBoxJnlLine.NEXT = 0;
TempICOutBoxSalesHdr.SETRANGE("IC Transaction No.",TempICOutboxTrans."Transaction No.");
TempICOutBoxSalesHdr.SETRANGE("IC Partner Code",TempICOutboxTrans."IC Partner Code");
TempICOutBoxSalesHdr.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
IF TempICOutBoxSalesHdr.FIND('-') THEN
REPEAT
ICInboxOutboxMgt.OutboxSalesHdrToInbox(ICInboxTransaction,TempICOutBoxSalesHdr,ICInboxPurchHdr);
UNTIL TempICOutBoxSalesHdr.NEXT = 0;
TempICOutBoxSalesLine.SETRANGE("IC Transaction No.",TempICOutboxTrans."Transaction No.");
TempICOutBoxSalesLine.SETRANGE("IC Partner Code",TempICOutboxTrans."IC Partner Code");
TempICOutBoxSalesLine.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
IF TempICOutBoxSalesLine.FIND('-') THEN
REPEAT
ICInboxOutboxMgt.OutboxSalesLineToInbox(ICInboxTransaction,TempICOutBoxSalesLine,ICInboxPurchLine);
UNTIL TempICOutBoxSalesLine.NEXT = 0;
TempICOutBoxPurchHdr.SETRANGE("IC Transaction No.",TempICOutboxTrans."Transaction No.");
TempICOutBoxPurchHdr.SETRANGE("IC Partner Code",TempICOutboxTrans."IC Partner Code");
TempICOutBoxPurchHdr.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
IF TempICOutBoxPurchHdr.FIND('-') THEN
REPEAT
ICInboxOutboxMgt.OutboxPurchHdrToInbox(ICInboxTransaction,TempICOutBoxPurchHdr,ICInboxSalesHdr);
UNTIL TempICOutBoxPurchHdr.NEXT = 0;
TempICOutBoxPurchLine.SETRANGE("IC Transaction No.",TempICOutboxTrans."Transaction No.");
TempICOutBoxPurchLine.SETRANGE("IC Partner Code",TempICOutboxTrans."IC Partner Code");
TempICOutBoxPurchLine.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
IF TempICOutBoxPurchLine.FIND('-') THEN
REPEAT
ICInboxOutboxMgt.OutboxPurchLineToInbox(ICInboxTransaction,TempICOutBoxPurchLine,ICInboxSalesLine);
UNTIL TempICOutBoxPurchLine.NEXT = 0;
TempICDocDim.SETRANGE("Transaction No.",TempICOutboxTrans."Transaction No.");
TempICDocDim.SETRANGE("IC Partner Code",TempICOutboxTrans."IC Partner Code");
TempICDocDim.SETRANGE("Transaction Source",TempICOutboxTrans."Transaction Source");
IF TempICDocDim.FIND('-') THEN
REPEAT
CASE TempICDocDim."Table ID" OF
DATABASE::"IC Outbox Sales Header": NewTableID := DATABASE::"IC Inbox Purchase Header";
DATABASE::"IC Outbox Sales Line": NewTableID := DATABASE::"IC Inbox Purchase Line";
DATABASE::"IC Outbox Purchase Header": NewTableID := DATABASE::"IC Inbox Sales Header";
DATABASE::"IC Outbox Purchase Line": NewTableID := DATABASE::"IC Inbox Sales Line";
END;
ICInboxOutboxMgt.OutboxDocDimToInbox(
TempICDocDim,ICInboxDocDim,NewTableID,FromICPartnerCode,ICInboxTransaction."Transaction Source");
UNTIL TempICDocDim.NEXT = 0;
END;
IF XMLInvoice.LENGTH > 0 THEN BEGIN
Bytes := Convert.FromBase64String(XMLInvoice);
MemoryStream := MemoryStream.MemoryStream(Bytes);
ICInboxTransaction."XML Document".CREATEOUTSTREAM(OutStr);
MemoryStream.WriteTo(OutStr);
END;
IF PDFInvoice.LENGTH > 0 THEN BEGIN
Bytes := Convert.FromBase64String(PDFInvoice);
MemoryStream := MemoryStream.MemoryStream(Bytes);
ICInboxTransaction."PDF Document".CREATEOUTSTREAM(OutStr);
MemoryStream.WriteTo(OutStr);
END;
IF PDFDetails.LENGTH > 0 THEN BEGIN
Bytes := Convert.FromBase64String(PDFDetails);
MemoryStream := MemoryStream.MemoryStream(Bytes);
ICInboxTransaction."Details Document".CREATEOUTSTREAM(OutStr);
MemoryStream.WriteTo(OutStr);
END;
ICInboxTransaction.MODIFY;
EXIT(TRUE);
END ELSE BEGIN
ResponseMessage := Text003;
EXIT(FALSE);
END;
END;
BEGIN
END.
}
}0 -
Try this - works for me!
HTTPRequest := HTTPRequestClass.XMLHTTPRequestClass; // I'm adding text to a bigtext variable here. Not important for you IF URL[1] <> '' THEN XMLTextNode.ADDTEXT(URL[1]); HTTPRequest.open('POST',WebaddressToPostTo, FALSE,'',''); // You might also want to change your RequestHeader HTTPRequest.setRequestHeader('Content-type','application/x-www-form-urlencoded; charset=utf-8'); HTTPRequest.send(XMLTextNode); IF NOT (HTTPRequest.status = 200) THEN MESSAGE(FORMAT(COPYSTR(HTTPRequest.statusText,1,250))); ResponseText := HTTPRequest.responseText;
And you can continue error handling and whatever.
Variables:Name DataType Subtype Length HTTPRequest DotNet MSXML.XMLHTTPRequest.'Microsoft.MSXML, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' HTTPRequestClass DotNet MSXML.XMLHTTPRequestClass.'Microsoft.MSXML, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' XMLTextNode BigText
0 -
I suggest not using XMLHTTP. That requires that object to be installed and that is not a standard .net object that is installed everywhere.
http://www.dynamics.is/?s=web+service will help you
http://objects4nav.com/web-service-ping-function-for-nav-2013-r2/ will give you code samples that you can use to save you some work.________________________________
Gunnar Gestsson
Microsoft Certified IT Professional
Dynamics NAV MVP
http://www.dynamics.is
http://Objects4NAV.com0 -
Thanks Zeon, TheGunzo.
This is my new code, but some lines give an error (see NOTE):
//>>
Variables:
XmlHttpHandler2 System.Net.Http.HttpClient.'System.Net.Http, Version=4.0.0.0
XmlHttpHandler System.Net.Http.HttpClientHandler.'System.Net.Http, Version=4.0.0.0
XmlHttpRequestMessage System.Net.Http.HttpRequestMessage.'System.Net.Http, Version=4.0.0.0
XmlHttpMethod DotNet System.Net.Http.HttpMethod.'System.Net.Http, Version=4.0.0.0
XmlHttpContent System.Net.Http.StringContent.'System.Net.Http, Version=4.0.0.0
XmlHttpRequestHeader System.Net.Http.Headers.HttpRequestHeaders.'System.Net.Http, Version=4.0.0.0
XmlHttpClient System.Net.Http.HttpClient.'System.Net.Http, Version=4.0.0.0
XmlHttpResponseMessage: System.Net.Http.HttpResponseMessage.'System.Net.Http, Version=4.0.0.0
CurrNode System.Xml.XmlNode.'System.Xml, Version=4.0.0.0
Code:
XmlHttpHandler := XmlHttpHandler.HttpClientHandler();
XmlHttpMethod := XmlHttpMethod.HttpMethod('POST');
XmlHttpRequestMessage := XmlHttpRequestMessage.HttpRequestMessage(XmlHttpMethod,WebServiceURL);
{
Testing:
XmlHttpClient.DefaultRequestHeaders := ('Content-Type','text/xml');
XmlHttpClient.DefaultRequestHeaders('SOAPAction','"http://tempuri.org/' + WebFunc + '"');
XmlHttpRequestMessage.Headers := XmlHttpClient.DefaultRequestHeaders;
}
XmlHttpContent := XmlHttpContent.StringContent(XmlDoc.ToString);
XmlHttpRequestMessage.Content(XmlHttpContent);
XmlHttpHandler2 := XmlHttpHandler2.HttpClient(XmlHttpHandler);
XmlHttpHandler2.SendAsync(XmlHttpRequestMessage);
CLEAR(XmlDoc);
XmlDoc := XmlDoc.XmlDocument;
XmlHttpResponseMessage := XmlHttpResponseMessage.HttpResponseMessage;
XmlHttpResponseMessage.RequestMessage := XmlHttpRequestMessage.HttpRequestMessage(XmlHttpMethod,WebServiceURL);
IF XmlHttpResponseMessage.StatusCode <> 200 THEN BEGIN
ErrorNote := 'HTTP ' + FORMAT(XmlHttpResponseMessage.StatusCode) + ': ' + XmlHttpResponseMessage.ReasonPhrase;
EXIT(FALSE);
END;
XmlHttpContent := XmlHttpResponseMessage.Content;
XmlDoc.LoadXml(XmlHttpContent.ToString); NOTE: This line gives and error.
How can I store the data from the Response back in this XMlDoc?
CurrNode := XmlDoc.DocumentElement.SelectSingleNode('soap:Body/' + WebFunc + 'Response/' + WebFunc + 'Result');
IF NOT ISNULL(CurrNode) THEN
ReturnMessage := CurrNode.InnerText;
IF XmlHttpResponseMessage.IsSuccessStatusCode THEN
EXIT(TRUE);
ErrorNote := COPYSTR(ReturnMessage,1,MAXSTRLEN(ErrorNote));
EXIT(FALSE);
//<<Roelof de Jonghttp://www.wye.com0 -
Zeon,
That Code works Perfectly. Many Thanks0
Categories
- All Categories
- 73 General
- 73 Announcements
- 66.6K Microsoft Dynamics NAV
- 18.7K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 617 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 320 Dynamics CRM
- 111 Dynamics GP
- 10 Dynamics SL
- 1.5K Other
- 990 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 35 Design Patterns (General & Best Practices)
- 1 Architectural Patterns
- 10 Design Patterns
- 5 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1.1K General Chat
- 1.6K Website
- 83 Testing
- 1.2K Download section
- 23 How Tos section
- 252 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions