ASP.NETでのPOSTリクエストの投げ方についての質問

このQ&Aのポイント
  • ASP.NET(C#)および.NETフレームワーク2.0環境でのPOSTリクエストの投げ方について困っています。ベーシック認証付きのREST APIを使用したいのですが、リクエストの投げ方がわかりません。
  • POSTリクエストを使用し、特定のURLを対象にするために「item」というキーにURLの配列を指定する必要があります。しかし、現在作成しているコードではうまく動作しません。URLの配列の指定方法を教えていただけないでしょうか。
  • 試しに以下のコードを作成してみましたが、うまく動作しません。おそらくURLの配列の指定が正しく行われていない可能性があります。正しい指定方法について教えていただけると助かります。
回答を見る
  • ベストアンサー

POSTリクエストの投げ方

ASP.NET(c sharp)、.netフレームワーク2.0環境です。 認証(ベーシック認証)付きのREST APIを使いたいのですが、 リクエストの投げ方が理解できず困っています。 URLを指定してリクエストを投げると動くものなのですが…。 使い方としては、 ・POSTリクエストを使用 ・"item"をキーにして、対象になるURLの配列を指定 とのことです。 { "item" : [ "http://www.yahoo.co.jp/test1.jpg", "http://www.google.co.jp/test2.jpg" ] } ↑サンプルとして載っていました 以下の通り作ってみましたが、うまく動きません。 URLの配列指定がうまく出来ていないのではないかと思うのですが、 方法を教えていただけないでしょうか。 宜しくお願いします。 //HttpWebRequestの作成 WebRequest webreq = WebRequest.Create("https://api.test.com"); webreq.Method = "POST"; //認証の設定 webreq.Credentials = new System.Net.NetworkCredential("test@test.com", "testpass"); //POSTするデータ string postData = "item=http://www.yahoo.co.jp/test1.jpg"; byte[] byteArray = Encoding.UTF8.GetBytes(postData); webreq.ContentType = "application/json"; webreq.ContentLength = byteArray.Length; Stream dataStream = webreq.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); WebResponse response = webreq.GetResponse(); dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd(); reader.Close(); dataStream.Close(); response.Close();

  • ginfix
  • お礼率34% (330/962)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

postDataがどう見てもJSON形式では無いです。 string postData = @"{ ""item"": [ ""http://www.yahoo.co.jp/test1.jpg"" ] }"; のように,正しく要求された形のJSONを送る必要があるのではないかと。 # APIが公開されている実サイトが書かれていないので,想像でしか書けませんが。

ginfix
質問者

お礼

すみません、見直してみたところうまくリクエストが返ってきました。 大変助かりました、ありがとうございました。

ginfix
質問者

補足

https://api.ccu.akamai.com/ccu/v2/docs/index.html apiはこれなんです。 正しくはobjectなんですが、ご指摘の通りJSON形式にして、見直してみました。 しかし、要求が不適切(400)と出てしまいました。

関連するQ&A

  • C#でのWebRequestでのPOSTについて

    C#初心者です。 現在Visual Studio2012にてC#でストアアプリ作成中ですが、サーバーへPOSTしリストを取得する処理で難航しています。 WebRequest request = WebRequest.Create("URL"); request.Method = "POST"; byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteArray.Length; と記述した場合にrequest.ContentLengthの箇所でContentLengthはSystem.Net.WebRequestに定義が含まれていませんとエラーが表示されます。 何が足りないのでしょうか? 何か追加のアセンブリを指定する必要がありますでしょうか?

  • 特定の値をPOST送信で他のサーバーに渡したい

    あるPHPページを自動転送ページとし、転送先に特定の値をPOST送信したいと考えています。 同じような質問があり、fsockopenを使ってすると良いようなのですが、どうしても上手くいきません。 現状、POST送信は成功しているのですが、URLが自動転送ページのままで、転送先ページのテキストのみが表示されている状態です。 どうすれば転送先ページに完全に移ってしまえるでしょうか。 ご助力下さい。 <ソース> $url = "http://hoge.co.jp/test.php";  //転送先URL $method = "POST"; $headers = "POST http://hoge.co.jp/test.php HTTP/1.1\r\n";  //転送先URL $postdata = "parm=ok"; $URL = parse_url($url); if(!isset($URL['port'])){$URL['port'] = 80;} //リクエストヘッダ $request = $method." ".$URL['path']." HTTP/1.0\r\n"; $request .= $headers; $request .= "Host: ".$URL['host']."\r\n"; $request .= "User-Agent: PHP/".phpversion()."\r\n"; $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; $request .= "Content-Length: ".strlen($postdata)."\r\n"; $request .= "\r\n"; $request .= $postdata; //相手サーバへ接続 @$fp = fsockopen($URL['host'], $URL['port']); // 接続失敗 if (!$fp) {die("ただいまメンテナンス中です。\n");} //POSTで送信 fputs($fp, $request); $response = ""; while (!feof($fp)) { $response .= fgets($fp, 4096); } fclose($fp); //ヘッダ部分とボディ部分を分離 $DATA = split("\r\n\r\n", $response, 2); //出力 echo "<!--\n".$request."\n-->\n"; echo "<!--\n".$DATA[0]."\n-->\n"; echo $DATA[1];

    • ベストアンサー
    • PHP
  • 「REQUEST_URI」と「REQUEST_FILENAME」について

    apacheのmod_rewriteを勉強していて、 「REQUEST_URI」と「REQUEST_FILENAME」の違いが 分からなくなってきてしました。 (1)REQUEST_URIと、 (2)REQUEST_FILENAME では、何が異なるのでしょうか? 次のURLの例の場合、 例) http://www.test12345.org/file/test.jpg  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (1)REQUEST_URIは「http://www.test12345.org/file/test.jpg」全てをさし、 (2)REQUEST_FILENAME は、「/file/test.jpg」 をさすという認識で合っているでしょうか? 「REQUEST_URI」と「REQUEST_FILENAME」の 違いがよく分からなくなってきました。 アドバイスの程宜しくお願い致します。

  • C#のGUIからサーバー側のPHPへ文字列を送信

    するプログラムを作っている途中で疑問箇所があります。 まず、クライアントというかC# GUI側のコードなのですが 以下、実際にHTTPリクエストを送る箇所のみですが this.postData = "value=" + HttpUtility.UrlEncode(this.box_01.Text,this.encode) + "&key=" + HttpUtility.UrlEncode(this.box_02.Text,this.encode); //this.postData = "test=日本語テスト"; //========================================================== //バイト配列型に変換※URLエンコード済みの文字列をアスキー文字列に変換 //========================================================== this.postDataBytes = Encoding.ASCII.GetBytes(this.postData); MessageBox.Show(this.postData); //MessageBox.Show(this.postDataBytes); string temp = ""; for(int i = 0; i < this.postDataBytes.Length; i ++){ temp += (char)postDataBytes[i]; } MessageBox.Show(HttpUtility.UrlDecode(temp)); //デバッグ //引数に通信先URLを指定してWebRequestクラスのインスタンスを作成 //httpリクエストインスタンスを作成 this.http = WebRequest.Create (url); this.http.Method = "POST"; //メソッドの指定 this.http.ContentType = "application/x-www-form-urlencoded"; //ContentTypeの指定(※必須) //送信するデータの長さを指定 this.http.ContentLength = this.postDataBytes.Length; MessageBox.Show(this.http.ContentLength.ToString()); //データ送信用のストリーム this.requestStream = http.GetRequestStream(); //送信するデータを書き込む this.requestStream.Write(this.postDataBytes,0,this.postDataBytes.Length); //送信終了 this.requestStream.Close(); //サーバーからの応答を取得 this.response = http.GetResponse(); Stream reponseStream = this.response.GetResponseStream(); StreamReader sr = new StreamReader(reponseStream,this.encode); MessageBox.Show(sr.ReadToEnd()); sr.Close(); MessageBox.Show (this.box_01.Text); まずGUI側の流れとしてはFormの中に二つのTextBoxを配置し二つの入力された値を urlencodeして一般的?なHTTPリクエストのクエリ状態にしてます。 で途中で this.postDataBytes = Encoding.ASCII.GetBytes(this.postData); という処理の箇所で、Urlencodeした文字列をアスキーコード?に変換しているようです。 実際に、コンソールに出力して、文字列が数字のみの配列になったのを確認しました。 そのまま、StreamWriterで書き込み・・送信しています。 で最終的にPHP側にHTTPリクエストして、レスポンスをMessageBoxで表示させます。 PHP側のソースですが <?php //$str = urldecode($_POST["value"]); $str = $_POST["value"]; $str_01 = $_POST["key"]; $fp = fopen("./sharp.txt","w+"); fwrite($fp,$str.$str_01); print "あなたの入力した内容は". $str."ですね\r\n"; print "keyの値は".$str_01."ですね"; ?> という記述をしており最終的にGUIのMessageBoxに表示されるのは print "あなたの入力した内容は". $str."ですね\r\n"; print "keyの値は".$str_01."ですね"; この部分に、入力した値がはいった文字列が表示されます。 で上記の流れの中で、C#側で途中Urlencodeしてそれをアスキーコードに変換してます。 そのアスキー文字をPHP側にリクエストしているのですが、これってPHP側で勝手にアスキー文字をもとのurlencodeの状態に復元し、さらにurldecodeしてマルチバイトの文字の状態にまで復元して表示しているということなのでしょうか? 識者の方ご教授ください。 よろしくお願いします。

  • twitterAPIについて

    twitterAPIについて です。 今Visual Studio 2008でC#.NETでtwitterのタイムラインを読み込んでみようと思っています。 xmlを読み込むまではできましたが、 そのxmlを抽出する方法が全く分かりません。 このさきどうすればいいのでしょうか? ユーザー1:ツイート ユーザー2:ツイート といった感じにTextBoxに並べるのが目標です。 文字列をxmlに変換する方法があるのでしょうか? 一応ソースコードを載せて起きます。(using部分、例外処理などは除く) private void XmlLoad() { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://twitter.com/statuses/home_timeline.xml"); request.Credentials = new NetworkCredential(IDtext.Text, passText.Text); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; request.Timeout = 10000; System.Net.ServicePointManager.Expect100Continue = false; WebResponse response = request.GetResponse(); Encoding enc = Encoding.GetEncoding(932); StreamReader reader = new StreamReader(response.GetResponseStream(), enc); string result = reader.ReadToEnd(); result = System.Web.HttpUtility.HtmlDecode(result); resultText.Text = result; reader.Close(); response.Close(); } private void OK_Click(object sender, EventArgs e) { XmlLoad(); } オブジェクト(TextBoxなど)は、 IDText(TextBox) passText(TextBox) OK(Button) resultText(TextBox) です! わかる方お願いします。 質問があれば答えます。

  • C#でHP上の特定データを自動更新で抽出したい

    ブラウザを立ち上げることなくHPに自動ログイン後、特定の表示データを抽出してリアルタイムに更新表示させたい(ブラウザでは更新ボタンのクリックが必要)。 ニコニコ動画の自動ログイン方法が公開されていますのでそれを真似て下記のプログラムを作成し、見かけ上は正常に動作していますが、これって「GetHtml」を呼ぶ度にログイン → ログアウトを繰り返すのでしょうか? もし、そうであればそれの回避方法を教えて頂けないでしょうか。(.Close()を呼ばないとか?) また、その確認方法があれば併せてお願いします。 /// ログイン (起動時1回のみ呼び出し) public bool LogIn() {  Hashtable hash = new Hashtable();  hash["username"] = "name";  hash["password"] = "123";  hash["Login"] = "login";  string s_param = "";  foreach (string s in hash.Keys)  {  s_param += string.Format("{0}={1}&", s, hash[s]);  }  HttpPost("Https", s_param); } /// POST送信 public void HttpPost(string s_url, string s_param) {  httpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  CookieContainer cookieContainer = new CookieContainer();  httpWebRequest.CookieContainer = cookieContainer;  httpWebRequest.ContentType = "application/x-www-form-urlencoded";  byte[] data = Encoding.ASCII.GetBytes(s_param);  httpWebRequest.ContentLength = data.Length;  httpWebRequest.Method = "Post";  Stream reqStream = httpWebRequest.GetRequestStream();  reqStream.Write(data, 0, data.Length);  reqStream.Close();  WebResponse webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  encoder = Encoding.GetEncoding("Shift_JIS");  StreamReader streamReader = new StreamReader(resStream, encoder);  spHtml = streamReader.ReadToEnd();  streamReader.Close();  webResponse.Close(); } /// HTML受信(タイマーイベントで常時呼び出し) private string GetHtml(string s_url) {  httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  httpWebRequest.CookieContainer = cookieContainer;  webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  StreamReader streamReader = new StreamReader(resStream, encoder);  string Html = streamReader.ReadToEnd();  streamReader.Close();  resStream.Close();  return Html; }

  • post送信のについて

    post送信について ボタン部分は画像にし、下記のように設定しましたが ちゃんとできてますでしょうか?ボタンを押しても飛ぶのはとびますが ちゃんとPOST送信になってるのか不安です。 ちなみにURLを残さないようにしてるはずがfirefoxだと残ってましたので 間違ってると思ってます。。 <script type="text/javascript" > var element = document.createElement("input"); document.form[0].appendChild(element); document.form[0].method = "post"; document.form[0].action = "test.aspx"; </script> <body> <form action="URL" method="post"> <input name="form1" type="image" src="images/test.jpg" alt=""> </form> <form action="URL2" method="post"><input name="form2" type="image" src="images/test.jpg" alt=""> </form> </body>

  • フォト蔵へアップロードできません(C#)

    フォト蔵へアップロードするとエラー400が出てしまいます。 何が原因なのでしょうか?原因を教えてください。 以下コード //フォト蔵へのアップロード(注意動きません)// //送信するファイルのパス filePath="C:\\Users\\Public\\Pictures\\Sample Pictures\\test.jpg"; //送信先のURL string url1 = "http://api.photozou.jp/rest/photo_add"; //文字コード System.Text.Encoding enc = System.Text.Encoding.GetEncoding("UTF-8"); //WebRequestの作成 System.Net.HttpWebRequest req = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url1); //メソッドにPOSTを指定 req.Method = "POST"; //ベーシック認証宣言、アカウントとパスワード req.PreAuthenticate = true; NetworkCredential network = new NetworkCredential("mailaddress@hoge.com", "password"); req.Credentials = network; //ヘッダを設定 req.Headers.Add("album_id", "1234567"); //ContentTypeを設定 req.ContentType = "image/jpeg"; //POST送信するデータを作成 System.IO.FileStream fs = new System.IO.FileStream( filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); //POST送信するデータの長さを指定 req.ContentLength = fs.Length; //データをPOST送信するためのStreamを取得 System.IO.Stream reqStream = req.GetRequestStream(); //ファイルの内容を送信 byte[] readData = new byte[0x1000]; int readSize = 0; while (true) { readSize = fs.Read(readData, 0, readData.Length); if (readSize == 0) break; reqStream.Write(readData, 0, readSize); } fs.Close(); reqStream.Close(); //サーバーからの応答を受信するためのWebResponseを取得 System.Net.HttpWebResponse res = (System.Net.HttpWebResponse) req.GetResponse(); //応答データを受信するためのStreamを取得 System.IO.Stream resStream = res.GetResponseStream(); //受信 System.IO.StreamReader sr = new System.IO.StreamReader(resStream, enc); //閉じる sr.Close();

  • PHP stream_context_creat

    今日は、 境内のメソッドについて質問があります。 以下のスクリプトについてですが、 <?php //POSTする送信データ $postData = array ( "key_01" => "POST送信データ01&", "key_02" => "POST送信データ02&", ); //送信するデータをURLエンコードする $postData = http_build_query($postData); $header = array( "http" => array( //(1) "method" => "POST", //(2) "header" => "Content-type: application/x-www-form-urlencoded\r\nuser_name: testuser_name", //(3) "content" => $postData //(4) ) ); //上記headerという変数からHTTPリクエストのストリームを作成する $request = stream_context_create($header); $res = file_get_contents("http://localhost/stream02.php",false,$request); print $res; 上記のようなスクリプにおける、ストリームというのはいわゆるクライアント側から サーバー側へ送信するHTTPリクエストと同義のものでしょうか? であればHTTPレスポンスのようにそのヘッダーの中身を取得する getallheaders()というような感じで、実際に、送信されるHTTPリクエストの 中身を視認したいのですが可能でしょうか? 以下サイトの http://www.tohoho-web.com/ex/http.htm HTTPサンプルのように取得したいのですが・・・。 また、冒頭に記述したスクリプトですが php.iniのallow_url_fopenの箇所がonになっていないと実行できないことは 確認したのですが、もし仮にallow_url_fopenがOffになっていた場合、 上記のようにストリームと呼ばれるものを使ってHTMLフォーム以外でPOSTリクエスト したい場合は何か方法があるのでしょうか? 通常であればPEARのHTTP_Requestとかで処理するかと存じますが、 PHPの組み込み関数のみでやる場合、他に方法ってありますか? 識者の方ご教授ください。

    • ベストアンサー
    • PHP
  • HTTP レスポンスヘッダ

    URLを指定してHTTP レスポンスヘッダ等が確認できるサイトで、 Request typeをGETやPOSTが選択可能なところを探しています。 少し探した結果、 http://web-sniffer.net/ というところが見つかりましたが、このようなサイトが他にもあれば教えてください。 宜しくお願いします。

専門家に質問してみよう