I have been struggling with this problem for almost a month, and I found everything I can find on the Internet without any solution. This is my problem: I am Implement a client for RESTful API service, the service must send XML file in vb.net via POST call. I can get some data in xml format, but when sending this Xml file, I always get “400 Bad request Error”.
I have found that it must be a key that must be passed to the server (obviously only accept POST file upload, I can not send it as a string).
Basically this call is used with cURL, but I am trying to implement my own call in vb.net, passing the correct value.
Working cURL call: (Successfully transferred XML)< /p>
c:>curl -u username:password -F "[email protected]" -X POST http://hostname.com/URI?parameters
Vb.net code not working: (This gives me 400 Bad Request)
Dim ss As String = ""'server says...
Dim S As String = txb_username.Text & ":" & txb_password.Text
Dim EncodedString As String = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(S))
Dim req As HttpWebRequest = Nothing
Dim res As HttpWebResponse = Nothing
Try
Dim xmlDoc As System.Xml.XmlDocument = New System.Xml.XmlDocument
xmlDoc.XmlResolver = Nothing
xmlDoc.Load("c:\path\file4.xml")
D im sXML As String = "file" & xmlDoc.InnerXml'<- This is where I try to put the "KEY"
Dim url As String = "http:/host.com+URI"< br />
req = CType(WebRequest.Create(url), Net.HttpWebRequest)'or Directcast ...
req.Method = "POST"
req.Headers.Add(" Authorization: Basic "& EncodedString)
req.ContentType = "multipart/form-data"
req.ContentLength = sXML.Length
req.Accept = "*/*"
System.Windows.Forms.Application.DoEvents()
Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(req.GetRequestStream)
StatusUpdate(sXML )
sw.Write(sXML)
sw.Close()
ss = "server says: "
res = CType(req.GetResponse, HttpWebResponse)
StatusUpdate (req.ToString)
Catch ex As Exception
StatusUpdate(ss & ex.Message)
Finally
End Try
It’s because of me Want to send it as a string? (But how can I send it as a file?)
For this, I did another process of sending data bytes, but this one also gave me “400” because (I assume) I didn’t put the “file “Key.
Dim requestStream As Stream = Nothing
Dim fileStream As FileStream = Nothing
Dim uploadResponse As Net.HttpWebResponse = Nothing
< br /> Try
Dim uploadRequest As Net.HttpWebRequest = CType(Net.HttpWebRequest.Create(URI.Text & Uri_part2.text), Net.HttpWebRequest)
uploadRequest. Method = Net.WebRequestMethods.Http.Post
uploadRequest.ContentType = "text/xml; charset=utf-8"
uploadRequest.Credentials = New NetworkCredential("user", "pass")
uploadRequest.KeepAlive = True
uploadRequest.UserAgent = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"
uploadRequest.Accept = ("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
uploadRequest.Headers.Add("Accept- Language: en-us,en;q=0.5")
up loadRequest.Headers.Add("Accept-Encoding: gzip,deflate")
uploadRequest.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 ")
uploadRequest.Headers.Add("Content-Disposition: form-data; name=""file"";")
uploadRequest.ContentType = "application/xml; charset=utf-8"
requestStream = uploadRequest.GetRequestStream()
fileStream = File.Open("C:\example.xml", FileMode.Open)
Dim a As Integer
Dim buffer(1024) As Byte
Dim bytesRead As Integer
While True
a = a + 1
bytesRead = fileStream.Read(buffer, 0, buffer.Length)
StatusUpdate(buffer(a))
If bytesRead = 0 Then
Exit While
End If
requestStream.Write( buffer, 0, bytesRead)
End While
requestStream.Close()
uploadResponse = uploadRe quest.GetResponse()
Dim responseReader As StreamReader = New StreamReader(uploadRequest.GetResponse.GetResponseStream())
Dim x As String = responseReader.ReadToEnd()
responseReader.Close()
StatusUpdate(x)
Catch ex As UriFormatException
StatusUpdate("UriFormatException: "& ex.Message)
Catch ex As IOException
StatusUpdate ("IOException: "& ex.Message)
Catch ex As Net.WebException
StatusUpdate("Net.WebException:" & ex.Message)
Finally
If uploadResponse IsNot Nothing Then
uploadResponse.Close()
End If
If fileStream IsNot Nothing Then
fileStream.Close()
End If
If requestStream IsNot Nothing Then
requestStream.Close()
End If
End Try
In any case, I also tried 2 other clients (POSTMAN and REST console, 2 Google Chr ome extension), I can use it only by adding the value “file” to the “key” field. I have to insert the specific 4 characters “file” to make it work. So, the question is: how to do it in Vb.net Add the same value in the call? How to translate the code called by cURL in the working Vb.net code? Thank you very much for your time and help!
Find the image of what I want to add here,
Attachment: I can’t use PUT, I must use POST (server limit)
I also added To get the HTML code suitable for my purpose, use the server on my computer (see “File” button again)
< br />
In addition, I also pasted a script in PERL, the script It can also be used with the server on my computer.
#!perl
use strict;
use LWP; # Loads all important LWP classes
my $client_id = 1234;
my $filename = "new_file.xml";
### Prepare to make a request
my $browser = LWP::UserAgent->new;
my $url = "http://uri.com?&xx=$client_id" ;
my @post_pairs = (
#'client_id_in' => $client_id,
'file' => [$filename],
);
my @ns_headers = (
'User-Agent' =>'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10',< br />'Accept' =>'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' =>'en- us,en;q=0.5',
'Accept-Encoding' =>'gzip,deflate',
'Accept-Charset' =>'ISO-8859-1,utf-8;q= 0.7,*;q=0.7',
'Authorization' =>'Basic base64EncodedCredentialsHere',
'Content_Type' =>'form-data',
);
### Make a request
my $response = $browser->post($url, \@post_pairs, @ns_headers);
die "Can't get $url - ", $ response->status_line
unless $response->is_success;
### Display the response
print STDOUT $response->content;
< div class="content-split">
I think your problem is that you really don’t know what the request should look like. Please use fiddler to view the request sent by cURL, and Try to use vb.net to achieve the same request. In my opinion, your secons code snippet (using a buffer, not an xml serializer) should work…but only on the server side can understand this structure. div>
I have been struggling with this issue for almost a month, I found everything I can find online without any solution. This is my problem: I am implementing a client for a RESTful API service, which must send an XML file in vb.net via a POST call. I was able to Get some data in xml format, but when sending this Xml file, I always get “400 Bad Request Error”.
I have found that it must be a key that must be passed to the server (Obviously only accept POST file uploads, I can’t send it as a string).
Basically this call is used with cURL, but I am trying to implement my own in vb.net Call, pass the correct value.
Working curl call: (Transfer XML successfully)
c:>curl -u username:password -F "file [email protected]" -X POST http://hostname.com/URI?parameters
Vb.net code not working: (this gave me 400 Bad Request)
Dim ss As String = ""'server says...
Dim S As String = txb_username.Text & ":" & txb_password.Text
Dim EncodedString As String = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(S))
Dim req As HttpWebRequest = Nothing
Dim res As HttpWebResponse = Nothing
Try
Dim xmlDoc As System.Xml.XmlDocument = New System.Xml.XmlDocument
xmlDoc.XmlResolver = Nothing
xmlDoc.Load("c:\path\file4.xml")< br />
Dim sXML As String = "file" & xmlDoc.InnerXml'<- This is wh ere I try to put the "KEY"
Dim url As String = "http:/host.com+URI"
req = CType(WebRequest.Create(url) , Net.HttpWebRequest)'or Directcast ...
req.Method = "POST"
req.Headers.Add("Authorization: Basic "& EncodedString)
req.ContentType = "multipart /form-data"
req.ContentLength = sXML.Length
req.Accept = "*/*"
System.Windows.Forms.Application.DoEvents()
Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(req.GetRequestStream)
StatusUpdate(sXML)
sw.Write(sXML)
sw. Close()
ss = "server says: "
res = CType(req.GetResponse, HttpWebResponse)
StatusUpdate(req.ToString)
Catch ex As Exception
StatusUpdate(ss & ex.Message)
Finally
End Try
Is it because I want to send it as a string? (But how can I send it as a file?)
For this, I did another process of sending data bytes, but this one also gave me “400” because (I assume) I didn’t put the “file “Key.
Dim requestStream As Stream = Nothing
Dim fileStream As FileStream = Nothing
Dim uploadResponse As Net.HttpWebResponse = Nothing
< br /> Try
Dim uploadRequest As Net.HttpWebRequest = CType(Net.HttpWebRequest.Create(URI.Text & Uri_part2.text), Net.HttpWebRequest)
uploadRequest. Method = Net.WebRequestMethods.Http.Post
uploadRequest.ContentType = "text/xml; charset=utf-8"
uploadRequest.Credentials = New NetworkCredential("user", "pass")
uploadRequest.KeepAlive = True
uploadRequest.UserAgent = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"
uploadRequest.Accept = ("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
uploadRequest.Headers.Add("Accept- Language: en-us,en;q=0.5")
uplo adRequest.Headers.Add("Accept-Encoding: gzip,deflate")
uploadRequest.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 ")
uploadRequest.Headers.Add("Content-Disposition: form-data; name=""file"";")
uploadRequest.ContentType = "application/xml; charset=utf-8"
requestStream = uploadRequest.GetRequestStream()
fileStream = File.Open("C:\example.xml", FileMode.Open)
Dim a As Integer
Dim buffer(1024) As Byte
Dim bytesRead As Integer
While True
a = a + 1
bytesRead = fileStream.Read(buffer, 0, buffer.Length)
StatusUpdate(buffer(a))
If bytesRead = 0 Then
Exit While
End If
requestStream.Write( buffer, 0, bytesRead)
End While
requestStream.Close()
uploadResponse = uploadRequ est.GetResponse()
Dim responseReader As StreamReader = New StreamReader(uploadRequest.GetResponse.GetResponseStream())
Dim x As String = responseReader.ReadToEnd()
responseReader.Close()
StatusUpdate(x)
Catch ex As UriFormatException
StatusUpdate("UriFormatException: "& ex.Message)
Catch ex As IOException
StatusUpdate ("IOException: "& ex.Message)
Catch ex As Net.WebException
StatusUpdate("Net.WebException:" & ex.Message)
Finally
If uploadResponse IsNot Nothing Then
uploadResponse.Close()
End If
If fileStream IsNot Nothing Then
fileStream.Close()
End If
If requestStream IsNot Nothing Then
requestStream.Close()
End If
End Try
In any case, I also tried 2 other clients (POSTMAN and REST console, 2 Google Chrome Extension), I can use it only by adding the value “file” to the “key” field. I have to insert the specific 4 characters “file” to make it work. So, the question is: how to call it in Vb.net To add the same value? How to translate the code called by cURL in the working Vb.net code? Thank you very much for your time and help!
Find the image of what I want to add here,
Attachment: I can’t use PUT, I must use POST (server limit)
I also added To get the HTML code suitable for my purpose, use the server on my computer (see “File” button again)
< br />
In addition, I also pasted a script in PERL, the script It can also be used with the server on my computer.
#!perl
use strict;
use LWP; # Loads all important LWP classes
my $client_id = 1234;
my $filename = "new_file.xml";
### Prepare to make a request
my $browser = LWP::UserAgent->new;
my $url = "http://uri.com?&xx=$client_id" ;
my @post_pairs = (
#'client_id_in' => $client_id,
'file' => [$filename],
);
my @ns_he aders = (
'User-Agent' =>'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10',
'Accept' =>'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' =>'en-us, en;q=0.5',
'Accept-Encoding' =>'gzip,deflate',
'Accept-Charset' =>'ISO-8859-1,utf-8;q=0.7, *;q=0.7',
'Authorization' =>'Basic base64EncodedCredentialsHere',
'Content_Type' =>'form-data',
);
### Make a request
my $response = $browser->post($url, \@post_pairs, @ns_headers);
die "Can't get $url - ", $response- >status_line
unless $response->is_success;
### Display the response
print STDOUT $response->content;
I think your problem is that you really don’t know what the request should look like, please use fiddler to view the request sent by cURL and try to achieve the same request using vb.net. In my opinion , Your secons code snippet (using a buffer, not an xml serializer) should work…but only on the server side can understand this structure.