4

私はこの問題にほぼ1か月間苦労しており、オンラインで見つけたものをすべて読みましたが、解決策はありませんでした。これが私の問題です。vb.netでPOST呼び出しを介してXMLファイルを送信する必要があるRESTfulAPIサービスのクライアントを実装しています。xml形式のデータをGETする場合は機能させることができますが、このXmlファイルを送信する場合は、常に「400badrequesterror」が発生します。

サーバーに渡さなければならないキーの問題である必要があることはすでに理解しています(POSTのファイルアップロードのみを受け入れるようで、文字列として送信することはできません)。

基本的に、この呼び出しはcURLで機能しますが、vb.netで独自の呼び出しを実装し、適切な値を渡すのに苦労しています。

動作中のcURL呼び出し:(XMLを正常に送信します)

  c:>curl -u username:password -F "file=@filename.xml" -X POST http://hostname.com/URI?parameters

Vb.netコードが機能しない:(それは私に400の悪い要求を与えます)

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")

    Dim sXML As String = "file" & xmlDoc.InnerXml '<- This is where 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

文字列として送信しようとしているからですか?(しかし、他にどのようにファイルとして送信できますか?)このために、データのバイトを送信する別のプロシージャを作成しましたが、「ファイル」キーを入力しなかったため、これでも「400」が返されます。

    Dim requestStream As Stream = Nothing
    Dim fileStream As FileStream = Nothing
    Dim uploadResponse As Net.HttpWebResponse = Nothing

    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")
        uploadRequest.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 = uploadRequest.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

いずれにせよ、他の2つのクライアント(POSTMANとREST Console、Google Chrome用の2つの拡張機能)も試しましたが、「key」フィールドに値「file」を追加した場合にのみ機能します。それを機能させるには、特定の4文字の「ファイル」を挿入する必要があります。したがって、問題は、Vb.net呼び出しで同じ値を追加するにはどうすればよいですか?動作中のVb.netコードでcURL呼び出しのコードを変換するにはどうすればよいですか?お手数をおかけしますが、よろしくお願いいたします。

ここに追加したいものの画像を見つけて、欲しかった画像

PS PUTを使用できません。POSTを使用する必要があります(サーバー制限)

また、自分のPCのサーバーを使用して、自分の目的に合ったHTMLコードを追加します(「file」キーをもう一度参照してください)。

<html>
<body>
<form enctype="multipart/form-data" action="http://URI" method="POST">
<table border=0>

<tr>
<td align="right">File&nbsp;</td>
<td><input type="FILE" name="file"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit"></td>
</tr>
</table>
</form>
</body>
</html>

また、サーバーで動作しているスクリプトをコンピューターからPERLに貼り付けます。

  #!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',
    '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;
4

1 に答える 1

1

あなたの問題は、リクエストがどのように見えるべきか本当にわからないことだと思います.fiddlerを使用してcURLから送信されたリクエストを調べ、vb.netを使用して同じものを実装してみてください. 私の意見では、コードの secons 部分 (xml シリアライザーではなくバッファーを使用) は機能するはずですが、サーバー側でこの構造を理解できる場合に限ります。

于 2012-12-05T08:49:56.730 に答える