ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 ネットワークプログラミング

HTTP POSTを使ってサーバに接続

Connecting to Servers Using HTTP POST

HTTP GETを使ってサーバに接続
HTTP GETを使ってサーバに接続する方法を示しました。
それによりURLの最後に付け加えられたデータがサーバに
渡されます。
HTTP GETを使う代わりに、HTTP POSTメソッドを使うこともできます。
HTTP GETと共に、URLに含まれているすべてのデータが
サーバに渡され、データ量は大抵2000文字以下に制限されています。
HTTP POSTでデータをサーバに別々に送ることができ、
基本的にはデータサイズ制限を回避しています。
ここでは、HTTP POSTを使ってウェブサーバに接続する方法を示します。
HTTP POSTを使ってサーバに接続するには、
HttpClient、HttpPost、HttpResponseクラスを使います。

//---Connects using HTTP POST---
public InputStream OpenHttpPOSTConnection(String url){
  InputStream inputStream = null;
  try{
   HttpClient httpclient = new DefaultHttpClient();
   HttpPost httpPost = new HttpPost(url);

   //---set the headers---
   httpPost.addHeader("Host", "www.webservicex.net");
   httpPost.addHeader("Content-Type, "application/x-www-form-urlencoded");

   //---the key/value pairs to post to the server---
   List<NameValuePair>nameValuePairs = new ArrayList<NameValuePair>(2);
   nameValuePairs.add(new BasicNameValuePair("FromCurrency", "USD"));
   nameVluePairs.add(new BasicNameValuePair("ToCurrency#, "SGD"));
   httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

   HttpResponse httpResponse = httpclient.execute(httpPost);
   inputStream = httpResponse.getEntity().getContent();
  } catch (Exception e){
   Log.d("OpenHttpPOSTConnection", e.getLocalizedMessage());
  }
  return inputStream;
}

HTTP GETでサーバに接続するのように
為替換算ウェブサービスにHTTP POSTを使って接続します。
OpenHttpPOSTConnection()メソッドでは、
サーバに送信する必要のあるヘッダを加えるためにHttpPostクラスを
使うように仕向けます。
特に、HOSTとContent-Typeヘッダのセットが必要になります。
HttpPostオブジェクトのsetEntity()メソッドを使って
為替情報を送信する必要もあります。
ここでは、FromCurrencyとToCurrencyという2つのデータが
NameValuePairオブジェクトのリストとして渡されています。
HTTP GETでサーバに接続するのように
DownloadText()メソッドにあるOpenHttpPOSTConnection()を呼び出し、
結果、返って来た結果をダウンロードできます。

private String DownloadText(String URL){
  int BUFFER_SIZE = 2000;
  InputStream in = null;
  try{
   in = OpenHttpPOSTConnection(URL);
  }catch (Exception e){
   Log.d("Networking", e.getlocalizedMessage());
   return "";
  }

  InputStreamReader isr = new InputStreamReader(in);
  int charRead;
  String str = "";
  char[] inputBuffer = new char[BUFFER_SIZE];
  try{
   while((charTead = isr.read(inputBuffer)) > 0){
    //---convert the chars to a String---
    String readString = String.copyValueOf(inputBuffer, 0, charRead);
    str += readString;
    inputBuffer = new char[BUFFER_SIZE];
   }
   in.close();
  }catch(IOException e){
   Log.d("DownloadText", e.getLocalizedMessage());
   return "";
  }
  return str;
}

分離したスレッドにあるDownloadText()メソッドを呼び出す
必要もあり、AdyncTaskクラスのサブクラスを使って、
DownloadText()メソッドを囲みます。

private class DownloadTextTask extends AsyncTask<String, Void, String>{
  protected String doInBackground(String... urls){
   return DownloadText(urls[0];
  }

  @Override
  protected void onPostExecute(String result){
   Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
   Log.d("DownloadTextTask", result);
  }
}

最後に以下のステートメントの使用で、DownloadTextTaskクラスを
使いウェブサービスを呼び出します。

//---Using HTTP POST---
new DownloadTextTask().excute("http://www.webservicex.net/CurrencyConvertor.asmx/
           ConversionRate");

ちょっと注釈

AndroidManifest.xmlファイルにINTERNETパーミッションを
加えておくことを忘れずに。

ホーム
便利堂ロゴ
inserted by FC2 system