RESTエンドポイントへのHTTP POSTを作成する
-
06-07-2019 - |
質問
URL引数のみを使用してエンドポイントに単純なHTTPポストを作成しようとしています。
少なくとも次の指示を理解する方法:
urlという名前の単一のパラメーター、変更されたフィードのアドレスを使用して、そのアドレスにPOSTします。
XML-RPCメソッドと同様に、フィードが変更されたことを確認し、変更された場合はサブスクライバーに通知します。
イベントが記録されます。戻り値は、successとmsgの2つの属性を持つresultという名前のXMLメッセージです。
これは現在私のコードです:
public static void ping(string feed)
{
HttpWebResponse response = MakeRequest(feed);
XmlDocument document = new XmlDocument();
document.Load(response.GetResponseStream();
string success = document.GetElementById("success").InnerText;
string msg = document.GetElementById("msg").InnerText;
MessageBox.Show(msg, success);
}
private static HttpWebResponse MakeRequest( string postArgument)
{
string url = path + "?" + UrlEncode(postArgument);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
return (HttpWebResponse)request.GetResponse();
}
private static string UrlEncode( string value)
{
string result;
result= HttpUtility.UrlEncode("url") + "=" + HttpUtility.UrlEncode(value);
return result;
}
サーバーから間違った応答を受け取っているので、どういうわけか間違っていると思います。応答は次のとおりです。
ドキュメントの最上位では無効です。リソース 'file:/// C:/Users/ADMIN/AppData/Local/Temp/VSD1.tmp.XML ...の処理中にエラーが発生しました...
rue ^
アイデアはありますか?
事前に感謝
解決 3
これが、私が見つけたコードです。
HTTP POSTを使用して、ストリームの本文にパラメーターをエンコードします。これにより" url-foobar"が得られます。コンテンツ本文として。ボディにコンテンツタイプ、性質、境界などはありません。
private static HttpWebResponse MakeRequest(string path, string postArgument)
{
//string url = path + "?" + UrlEncode(postArgument);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
request.Method = "POST";
string boundary = Guid.NewGuid().ToString().Replace("-", "");
request.ContentType = "multipart/form-data; boundary=" + boundary;
Stream stream = request.GetRequestStream();
string result = string.Format("url={0}", postArgument);
byte[] value = Encoding.UTF8.GetBytes(result);
stream.Write(value, 0, value.Length);
stream.Close();
return (HttpWebResponse)request.GetResponse();
}
public static void ping(string server, string feed)
{
HttpWebResponse response = MakeRequest(server, feed);
XmlDocument document = new XmlDocument();
string result = GetString(response.GetResponseStream());
try
{
document.LoadXml(result);
}
catch
{
MessageBox.Show("There was an error with the response", "Error");
}
//MessageBox.Show(msg, success);
}
public static string GetString(Stream thestream)
{
int n = thestream.ReadByte();
byte[] bytes = new byte[n];
thestream.Read(bytes, 0, n);
return Encoding.ASCII.GetString(bytes);
}
GetStringの呼び出しはデバッグのみを目的としており、厳密には必要ありません。
私を正しい方向に導いてくれたここに来てくれたすべての人に感謝します。
他のヒント
.NETのAPIはわかりませんが、次のように指示を理解しています:「クエリ引数を使用してURLで投稿を実行」" p>
IOW:postArgumentを取得してurlに追加する代わりに、urlを呼び出して、メッセージ本文に適切にエンコードされたurl = foobarを提供することになっています。
さらに:リクエストの「Accept」ヘッダーを設定していることがわかりません。サーバーがそれを使用して応答する形式を認識する場合に重要になる可能性があります。
.NETでフォームの投稿を行う最良の方法は、WebClientクラスを使用することです。そのクラスは、POST(エンティティ本体にパラメーターを含む)またはGET(クエリ文字列引数としてエンコードされたパラメーターを使用)として、データを送信するために正しいことを行います。
そして、何が間違っているのかを把握するために、クライアントが返している実際の例外を示す必要があります。