オリジナルリンク:http://www.cnblogs.com/VinC/archive/2011/02/24/1964049.html
この章の目的:データサービスを確立するには、Android WCF、インターネット伝送JSON形式のモバイル用途により適したデータ伝送フォーマットを使用してアクセスすることができます。
サービス契約(のServiceContract)、サービスの実装(サービス)に応じて、当社のサービスの開発プロセスは、エンティティオブジェクトモデル(モデル)と、サービス公開プロセスを導入します。
この記事では、我々は明確でわかりやすい説明をすることはできませんいくつかの質問のために、AndroidのWCFへのアクセスをより浅く知っている彼のためにリンクのHTTPリクエスト私は地元の懸念は、綿密な調査をしないメイクを説明するためのコードを掲載されます。
A.サービス契約(契約)
【のServiceContract] パブリックインターフェイスIAccountJsonService { [OperationContract(NAME = "GetAccountDataJson")] [のWebGet(RequestFormat = WebMessageFormat.Json、ResponseFormat = WebMessageFormat.Json、UriTemplate = "GetAccountData"、bodyStyle属性= WebMessageBodyStyle.Bare)] 一覧<アカウント> GetAccountData (); [OperationContract(NAME = "SendMessageJson")] [WebInvoke(METHOD = "GET"、ResponseFormat = WebMessageFormat.Json、UriTemplate = "のSendMessage / {メッセージ}"、bodyStyle属性= WebMessageBodyStyle.Bare)] 列のSendMessage(文字列メッセージ)。 }
この契約は2つのメソッドを定義し、GetAccountData(アカウントデータ一覧、パラメータなしのメソッドを取得します)、データ伝送を介してクライアントから取得したのSendMessage、と返します。
1.注意WebInvoke(のSendMessageメソッド)この属性は、方法は、httpアクセス方法を示し、我々はGETを使用して、要求データであるサーバーからデータをそこに着くことに、これは他の属性に置き換えてもよい-WebGet(GetAccountData法);
私たちは、クライアントはJSONデータを返す、我々は単にWebInvokeで指定した形式またはのWebGet属性をResponseFormatでき与える2.名前からこの名前を見ることができます返されたデータ形式を開発することです。
3. UriTemplateプロパティは、これは、我々が要求メソッドを指定したパスが、例は後述されていることに留意すべきです。
II。サービス実装(サービス)
パブリッククラスAccountServiceの:IAccountJsonService { 公共の一覧<アカウント> GetAccountData() { MockAccount.AccountListを返します。 } パブリック文字列のSendMessage(文字列メッセージ) { リターン「メッセージ:」+メッセージ。 } }
ここだけIAccountJsonServiceインターフェイスを実現。
III。&シミュレーションデータエンティティオブジェクトモデル
エンティティクラスの定義:
[のDataContract] publicクラスアカウント { [DataMemberプロパティ] パブリック文字列名前{取得します。セット; } [データメンバー】 公衆INT年齢{得ます。セット; } [データメンバー] パブリック文字列アドレス{得ます。セット; } [データメンバー】 公共のDateTime誕生日{得ます。セット; } }
シミュレーションデータ:
パブリッククラスMockAccount { パブリック静的リスト<アカウント> AccountListは { 取得 { VARリスト=新しいリスト<アカウント>(); list.Add(新しいアカウント{名= "ビル・ゲイツ"、アドレス= "友誼東路"、年齢= 56、誕生日= DateTime.Now}); list.Add(新しいアカウント{NAME = "スティーブ・ポール・ジョブズ"、アドレス= "友誼西路"、年齢= 57、誕生日= DateTime.Now}); list.Add(新しいアカウント{名= "ジョン・D・ロックフェラー"、アドレス= "友誼北路"、年齢= 65、誕生日= DateTime.Now}); リストを返します。 } } }
アカウントアナログデータは最新のデータが生成されて表示する3つのアナログデータ、誕生日DateTime.Nowではなく、任意の時間を含むリストを返します。
IV。サービス公開
当社のサービスの内部この例では、コンソールの形で発行されている場合は、IISの出版限り、OK上のIISの環境設定で参照WCFサービス構成情報。
WCFの設定情報
<system.serviceModel> <行動> <serviceBehaviors> <行動名= ""> <serviceMetadata httpGetUrl = "MEX" httpGetEnabled = "真" /> <serviceDebug httpHelpPageEnabled = "true"をincludeExceptionDetailInFaults = "真" /> </行動> </ serviceBehaviors> <endpointBehaviors> <行動名= "WebHttpBindingBehavior"> <webHttp /> </行動> </ endpointBehaviors> </行動> <サービス> <サービス名= "Hosting.AccountService"> <エンドポイントアドレス= "XML"バインディング=」webHttpBinding」契約= "Hosting.IAccountXmlService" behaviorConfiguration = "WebHttpBindingBehavior" /> <! - <エンドポイントアドレス= "jsonの"バインディング= "webHttpBinding"契約= "Hosting.IAccountJsonService" behaviorConfiguration = "WebHttpBindingBehavior" /> - > <ホスト> <baseAddresses> <BASEADDRESS = "のhttpを追加します。//127.0。 0.1:82 / AccountServiceの"/> </ baseAddresses> </ホスト> </サービス> </サービス> </system.serviceModel>
マネージドサービスコンソールリリース
クラスプログラム { 静的な無効メイン(文字列[] args) { 使用(のServiceHostホスト=新規のServiceHost(typeof演算(AccountServiceの))) { host.Open()。 Console.WriteLineを( "AccountServiceの住所:"); foreachの(host.Description.EndpointsにおけるVARエンドポイント) { Console.WriteLineを(endpoint.Address.ToString())。 } Console.WriteLineを( "AccountServiceの押しは...サービスを停止するために、任意のキーを開始しました"); Console.ReadKey(); host.Close(); } } }
パートIIは、我々はAndroidの書き込みサービスにアクセスする方法について説明します。
このセクションでは、返されたデータを受け入れるとWCF HTTPリクエストの確立に分かれています。
A.は、HTTPリクエストのメソッドを確立します
保護された文字列のGetRequest(文字列のURL、DefaultHttpClientクライアント) 例外{スロー 文字列結果= NULLと、 int型からstatusCode = 0; HTTPGET getMethod =新しいHTTPGET(URL); Log.d(TAG、 "のGetRequestを行い、URL =" + URL + ""); {しようと getMethod.setHeader( "ユーザーエージェント"、USER_AGENTを)。 // HttpParamsのparams =新しいHttpParams(); //添加用户密码验证信息 。// client.getCredentialsProvider()のSetCredentials( //新しいAuthScope(ヌル、-1)、 //新しいUsernamePasswordCredentials(mUsername、mPassword)); HttpResponseをhttpResponse = client.execute(getMethod)。 //からstatusCode == 200正常 statusCode = httpResponse.getStatusLine()getStatusCode()。 Log.d(TAG、 "からstatusCode =" +からstatusCode)。 //处理返回的をhttpResponse信息 結果= retrieveInputStream(httpResponse.getEntity())。 }キャッチ(例外e){ Log.e(TAG、e.getMessage())。 新しい例外(e)を投げます。 }最後に{ getMethod.abort()。 } 戻り値の結果; }
URLパラメータ:我々は要求に対処したいです
クライアント:これは直接初期化するために、新しいDefaultHttpClient(新しいBasicHttpParamsを())を使用することができます。
この方法RetrieveInputStream方法は、HTTP要求が完了したとき、サーバはデータを処理するための方法を返すことに注意してください
WCFデータから返された最後の受信II。
保護された文字列retrieveInputStream(HttpEntity httpEntity){ int型の長さ=(INT)httpEntity.getContentLength(); (長さ<0)であれば 長さ= 10000。 StringBufferのStringBufferの=新しいStringBufferの(長さ)。 試す{ にInputStreamReader InputStreamReaderの=新たにInputStreamReader( httpEntity.getContent()、HTTP.UTF_8)。 チャーバッファは[] =新しいCHAR [長さ]。 int型カウント; ながら((= inputStreamReader.read(バッファ、0、長さカウント- 1))> 0){ stringBuffer.append(バッファ、0をカウント)。 } }キャッチ(にUnsupportedEncodingException電子){ Log.e(TAG、e.getMessage())。 }キャッチ(IllegalStateExceptionが電子){ Log.e(TAG、e.getMessage())。 }キャッチ(例外:IOException e)の{ Log.e(TAG、e.getMessage())。 } )(stringBuffer.toStringを返します。 }
この方法は、サーバから返されたWCFデータを受信した後、変換プロセスは、文字列を返します。
追加コンテンツ:
データカプセル化方式を要求する前に:
プライベート静的最終文字列BASE_URL =「http://10.0.2.2:82/BlogCategoryService/」。 プライベート静的最終文字列のEXTENSION = "JSON /" ;; プライベート静的最終文字列タグ=「API」。 プライベート静的最終文字列のUSER_AGENT = "Mozillaの/ 4.5"; 公共JSONObjectのgetObject(文字列SBJ)はJSONExceptionは、例外{スロー 新しいJSONObject(のGetRequest(BASE_URL + EXTENSION + SBJ))を返します。 } 公共JSONArrayのgetArray(文字列SBJ)はJSONExceptionは、スロー 例外{ 新しいJSONArray(のGetRequest(BASE_URL + EXTENSION + SBJ))を返します。 } 保護された文字列のGetRequest(文字列のURL){例外をスロー GetRequest(urlには、新しいDefaultHttpClient(新しいBasicHttpParamsを()))を返します。 }
概要:Cipianは、二つの主要な段階のHttpリクエストを示し、サーバデータ受信を確立するための要求で返され、その後、JSONデータを扱う方法については、次の主要な指示で、サーバから返され、データは上記のUIに表示されます。