0

Android アプリから単純な JSON Web サービスを呼び出す際に問題が発生しています。.execute() は 200-OK ステータスで正常に完了しますが、JSON 出力またはテキストを読み取ることができません。

記録として、Google.com のような通常の Web ページを HttpPost すると、すべてのマークアップを読み取って解析できます。また、デバイスのブラウザーから完全なurlWithParams文字列を呼び出すことができ、ブラウザーに JSON 出力が表示されます。これはデバイスのブラウザで機能します:

http://maps.googleapis.com/maps/api/distancematrix/json?origins=Seattle&destinations=San+Francisco&mode=bicycling&language=fr-FR&sensor=false

コードを実行すると、リーダーは常に空白になり、reader.readLine() は実行されません。空の文字列を返します。URL を Google.com に変更すると、17,000 文字が返されます。ありがとう!

    protected String doInBackground(String... uri) {

    String responseString = null;   

    try {
                //String urlGoogle = "http://google.com";
                //String urlWithParams = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=Seattle&destinations=San+Francisco&mode=bicycling&language=fr-FR&sensor=false";
                String urlOnly = "http://maps.googleapis.com/maps/api/distancematrix/json";
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(urlOnly);

                httpPost.setHeader("Accept", "application/json");
                httpPost.setHeader("Content-type", "application/json");

                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("origins", "Seattle"));
                nameValuePairs.add(new BasicNameValuePair("destinations", "Cleveland"));
                nameValuePairs.add(new BasicNameValuePair("sensor", "false"));
                httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                HttpResponse response = httpclient.execute(httpPost);

                int status = response.getStatusLine().getStatusCode();

                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                StringBuilder sb = new StringBuilder();

                String line = null;
                try {
                    while ((line = reader.readLine()) != null) {
                        sb.append((line + "\n"));
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                responseString = sb.toString();
                }}
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
          } 
        catch (ClientProtocolException e) {
            e.printStackTrace();
        } 
        catch (IOException e) {
            e.printStackTrace();                
        } 

        return responseString;
    }
4

3 に答える 3

0

application/json の代わりに他の MIME タイプをテストする必要があるかもしれません。

于 2013-11-06T13:41:25.123 に答える
0

解決しました!JSON ページを呼び出したときに空白が返されるのは、プロキシ設定が定義されていないことが原因でした。プロキシ設定はデバイスでセットアップされましたが、この投稿によると、HttpClient はそれらを継承しません。

次の行を追加すると、問題が解決しました。コードは JSON を返すようになりました。

HttpHost proxy = new HttpHost("172.21.31.239", 8080);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
于 2013-11-07T00:29:38.097 に答える
0

1 - INTENET 権限があるかどうかに関係なく、マニフェスト ファイルをチェックインします。

2 - このコードを使用してデータを返す

  BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
try {
        String inputLine;
    while ((inputLine = reader.readLine()) != null) {
    responseString   += inputLine;
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
   }
 }
于 2013-11-06T13:46:04.517 に答える