私は PHP で SOAP から情報を取得しようとしていますが、この投稿Android SOAP wsdlの助けを借りてそのタスクを達成しています。ただし、不足していることがいくつかありますので、説明していただき、より良い選択肢を教えていただきたいと思います。
現在、私のPHPコードは次のとおりです。
$query = $db->prepare("SELECT name FROM `oc_category_description`");
$query->execute();
$result = $query->get_result();
$all = array();
while($row = $result->fetch_array(MYSQL_ASSOC)){
$all[] = array_map('utf8_encode', $row);
}
return json_encode($all);
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
exit();
Java Android では、次のように読みます。
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
Object response = (Object) envelope.getResponse();
String strRet = response.ToString();
TextView txt = (TextView)findViewById(R.id.textView1);
txt.setText(strRet);
このコードで情報を取得できますが、これは最善の方法ではありません。情報は次の例のようになります。
[{'name':'Google'},{'name':'ol\u00f3'},{'name':'yahoo'}]
このように表示されるだけでなく、特殊文字が付属しています。そして、私はそれらを避けたいです。
私にとって最善の方法は、以下のコードのようなものです (Google でこの例をよく見かけます):
SoapObject response = (SoapObject) envelope.getProperty(0);
したがって、配列リスト(長さなど)を取得し、アイテムをより適切に管理できます。
ただし、その解決策を試してみたところ、次のエラーが表示されました。
9-27 07:30:40.094: W/System.err(3171): java.lang.ClassCastException: java.lang.String は org.ksoap2.serialization.SoapObject にキャストできません
私は問題が私のPHPにある可能性があると信じているので、現在成功していません:
$query = $db->prepare("SELECT name FROM `oc_category_description`");
$query->execute();
$query->bind_result($name);
$query->store_result();
$all = array();
while($query->fetch()){
$all[] = array('nome' => $row);
}
$query->close();
$db->close();
return json_encode($all);
おすすめは何ですか?取得できる現在の値を解析しますか? もしそうなら、どのように?また、複数の列がある場合、特殊文字の最適なアプローチは何ですか?
皆さん、ありがとうございました。