質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • C#

    4783questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1214questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Xamarin

    314questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

XamarinでREST送信 「GetResponseAsync」がHttpWebRequestにないとエラー

解決済

回答 1

投稿 2017/11/08 23:19 ・編集 2017/11/08 23:27

  • 評価
  • クリップ 0
  • VIEW 105

dendenmushi

score 8

Visual Studio 2017 Community
OS:Win10

xamarin.FormsでREST送信をしてみたいと思い以下サイトを参考にコード記載しているのですが、「GetResponseAsync」がHttpWebRequestにないといったエラーが出ている状態です。
BeingGetResponseだと存在するようなのですが使い方を調べているのですがわからず、どのようにしたら下記サイトのREST送信が実現できるのでしょうか。
よろしくお願い致します。

参考にしているサイト:
https://xamarin.jp/2016/05/12/xamaris-forms-rest%E9%80%9A%E4%BF%A1%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Xamarin.Forms;

//①Xamarin.formsにて右クリの新規項目作成のxamarin.formsのContentPage作成後に以下3つusing追加
using System.IO;
using System.Net;
using System.Threading.Tasks;

namespace URLAccessGetView
{
    public class ClientPage : ContentPage
    {
        public ClientPage()
        {
            Content = new StackLayout
            {
                Children = {
                    new Label { Text = "Welcome to Xamarin Forms!" }
                }
            };

            //②URLにアクセスするためのボタン追加
            var getButton = new Button()
            {
                Text = "GET",
                VerticalOptions = LayoutOptions.StartAndExpand,
                HorizontalOptions = LayoutOptions.Center
            };

            //③アクセスして返ってくるデータをラベル表示
            var resultLabel = new Label()
            {
                Text = "",
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand
            };

            //④ResponseAsyncの実行後にresultLabelのTextを取得
            getButton.Clicked += async (s, a) =>
            {
                var url = "http://xamarin.jp";//ターゲットとなるサイトURL

                var getResult = await ResponseAsync(url);

                resultLabel.Text += getResult;
            };

        }

        //⑤GETリクエスト送信で返ってきた文字列を表示する。Xamarin.Formsは非同期メソッドしか参照できないので、async/await使用。
        public async Task<string> ResponseAsync(String url)
        {
            //返ってきたデータを保存する変数
            String result;
            var httpWebReq = (HttpWebRequest)HttpWebRequest.Create(url);
            httpWebReq.Method = "GET";

            //レスポンスを受け取る
            using (var response = await httpWebReq.GetResponseAsync())
            {
                using (var resStream = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(resStream))
                    {
                        result = sr.ReadToEnd();
                    }
                }
            }
            return result;
        }
    }    
}

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

こんにちは。田淵と申します。

Mac の Visual Studio では同じコードが動くので Windows の Visual Studio 2017 で参照がないというのは少し不思議です。(2017/11/10 追記:Visual Studio 2017 でも同じコードはビルドできました。PCL の Profile の問題かもしれません。Profile については こちら をご覧ください。)

ただ、どちらかというと HttpWebRequest は古い API なので、代わりに HttpClient を使った方が使い勝手が良いと思います。

HttpClient クラス System.Net.Http (MSDN ドキュメント) 

Web API よりも HttpClient に注目したい - しばやん雑記 

などが参考になるかと思います。

public async Task<string> ResponseAsync(String url)
{
    //返ってきたデータを保存する変数
    String result;

    //HttpClient を作成して Web のデータを読む
    using (var client = new HttpClient())
    {
        result = await client.GetStringAsync(url);
    }
    return result;
}

HttpClient は接続先の数や Cookie の有無など条件によってはインスタンスを使いまわす使い方が推奨されていますが、まずは上記で動作するようになります。

HttpClient には様々な Get の方法があるので GetStringAsync でなくても GetStreamAsync で StreamReader に流してももちろん大丈夫です。

余談ですが、

//⑤GETリクエスト送信で返ってきた文字列を表示する。Xamarin.Formsは非同期メソッドしか参照できないので、async/await使用。

この「Xamarin.Formsは非同期メソッドしか参照できない」はそんなことはありません。普通に同期のメソッドももちろん参照できます。

ご参考になれば幸いです。

投稿 2017/11/09 22:33

編集 2017/11/10 15:05

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/10 00:37

    すごい!いつもブログ見てます!回答頂きありがとうござます!!さっそく行ってみます。ありがとうございました!

    キャンセル

  • 2017/11/10 22:28

    ありがとうございました。無事HttpClientでできました。田淵さんお忙しい中すいません。xamarinから自WEBサイトのDBで検索をしたいときは、どんなGetAsyncなどのメソッドを使っていけばいいのか調べ方といいますか基本的なところがわかっておらず、sqlクエリを記載して自由な検索をxamarin側で記載してWebAPIとしてサイトに投げることはできるのでしょうか。
    それとも検索時にどんなGetが投げられているかログで調べてからxamarin側でそれに合わせたWebAPIメソッドを記載していくということなのでしょうか。その記載方法含め基本的なところとしてお勧めのサイトなどあれば教えてください。どうかお願い致します。

    キャンセル

  • 2017/12/07 16:29

    https://teratail.com/questions/100071
    ここで回答をもらっているようなので割愛しますね。

    WebサイトのDBへのアクセス(SQL文)とWeb API(Rest)は全く違うものなので、私は全然詳しくないのですがSQL文を発行するなら ADO.NET(https://developer.xamarin.com/guides/android/application_fundamentals/data/part_4_using_adonet/)で直接接続することができるかもしれません。
    DBのポートにTCP接続してSQL文を発行する感じですかね。
    ただ、このようにWebのDBに直接アクセスする方法は一般的にはとりませんので、Web API を作成する必要があります。

    @okazuki さんの Web API のサンプルが [コチラ](https://github.com/runceel/OkazukiSampleApi/blob/master/OkazukiSampleApi/Controllers/PeopleController.cs) です。

    Web アプリから DB にアクセス([Web.config](https://github.com/runceel/OkazukiSampleApi/blob/master/OkazukiSampleApi/Web.config#L12-L14) の `ConnectionStrings` の部分)して、データオブジェクトを指定して、Json や XML として返却する感じです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • C#

    4783questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1214questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Xamarin

    314questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。