2017-09-09 7 views
1

APIからXMLデータを取り込みしようとしていますが、Nullを取得しようとしています。私はstackoverflowからいくつかのソリューションを試して、これは私の最新の反復です。ボタンを押した後にXMLデータがアプリケーションに取り込まれないのはなぜですか?エラーメッセージは表示されません。私はこれを2つのクラスに分けました。 1つのクラスはUIを持ち、ユーザーが入力した文字列をURL用に適切にフォーマットされた2つのフィールドに分け、AsyncTaskを持っています。他のクラスはURLインスタンスを持ち、実行されます。Android:アプリケーションで表示するXMLデータをダウンロードするNullを取得する

 

私は私が最終的に1のprintlnを試してみましたが、コンソールから、それをクリックし、それが適切なXMLに行ったとしてURLが正しく書式設定されて知っています。

 

GetProperty.java:

 

public class GetProperty { 

    public String address; 
    //URL with ZWSID 
    public static final String myURL = "http://www.zillow.com/webservice/GetDeepSearchResults.htm?zws-id=[REMOVED ID]"; 
    public String finalUrl; 
    String line; 
    private static final boolean DEBUG = true; 

    public GetProperty(String address) { 
     this.address = address; 
     finalUrl = myURL + address; 
     System.out.println("The FINAL URL string is: " + finalUrl); 
     line = ""; 

    } 

    public void load() throws MalformedURLException, IOException 
    { 
     //Create URL with address from above 
     URL url = new URL(finalUrl); 


     //URLConnection connection = url.openConnection(); 
     InputStream stream = url.openStream(); 
     BufferedReader br; 

     try 
     { 
      br = new BufferedReader(new InputStreamReader(stream)); 

      // consume any data remaining in the input stream 
      while (br.readLine() != null) { 
       line = line + br.readLine(); } 

      br.close();   

     } 

     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 

    public String getLine() { 
     return line; 
    } 
} 

 

ここコードで私が使用したテストアドレス(:2114ビゲローアヴェ/ ZIP 98109通りの)でした

MainActivity.java:

public class MainActivity extends AppCompatActivity { 

    EditText getStreetET; 
    EditText getZipET; 
    Button getInfoBTN; 
    TextView xmlTextView; 


    String streetAddress; 
    String zipAddress; 
    String userAddress; 
    GetProperty property; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getStreetET = (EditText) findViewById(R.id.editText); 
     getZipET = (EditText) findViewById(R.id.editText2); 
     xmlTextView = (TextView) findViewById(R.id.textView); 
     getInfoBTN = (Button) findViewById(R.id.button); 

     //Get information about address user typed in edit text when BUTTON is clicked 
     getInfoBTN.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       //Get text from user and change it to a string 
       streetAddress = getStreetET.getText().toString(); 
       //Add a + sign wherever there is a space in the street address 
       streetAddress = streetAddress.replaceAll(" ", "+"); 
       //adding &address= for the URL 
       streetAddress = "&address=" + streetAddress; 

       zipAddress = "&citystatezip=" + getZipET.getText().toString(); 

       //Combine street & zip into one string address 
       userAddress = streetAddress + zipAddress; 
       System.out.println("The user address without the URL is: " + userAddress); 

       //Make sure the user actually typed something 
       if(!containsWhiteSpace(userAddress)) { 
        getAddressInfoTask addressTask = new getAddressInfoTask(); 
        addressTask.execute(userAddress); 

       } 

       //Test if user typed in correct address? 
       else { 
        xmlTextView.setText(""); 
       } 
      } 
     }); 

    } 

    public static boolean containsWhiteSpace(String userAddress) { 
     if (!hasLength(userAddress)) { 
      return false; 
     } 
     int strLen = userAddress.length(); 
     for (int i = 0; i < strLen; i++) { 
      if (Character.isWhitespace(userAddress.charAt(i))) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static boolean hasLength(String userAddress) { 
     return (userAddress != null && userAddress.length() > 0); 
    } 

    //AsyncTask for separate thread due to internet connection 
    private class getAddressInfoTask extends AsyncTask<String, Void, GetProperty> 
    { 

     protected GetProperty doInBackground(String... params) 
     { 


      property = new GetProperty(userAddress); 
      try 
      { 
       property.load(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

      return property; 
     } 

     protected void onPostExecute(GetProperty property) 
     { 
      //Place the XML in the TextView 
      xmlTextView.setText(property.getLine()); 
     } 
    } 


} 
+1

ブレークポイントでデバッグを試しましたか? – Raghunandan

+1

このツールを使用してXMLを表示しようとしました:https://codebeautify.org/xmlviewer(URLからロード)。それは言う: "エラー:無効または市/州/ ZIPパラメータが無効または不足"(コード:501)ので、問題があなたのリンクにある –

答えて

0

私はhttps://www.google.comに変数finalUrlセットでyour'eコードを試してみました、それはアプリでXMLを印刷することができました。したがって、コードの取得部分が機能します。

私はその後this blogと直接ブラウザ上でこのようなAPIキーを(あなたがそれを共有していないお勧めします)、使用に基づいて要求を試してみました:

http://www.zillow.com/webservice/GetSearchResults.htm?zws-id=X1-ZWz1fz4ljopwjv_4wzn5&address=1600%20Pennsylvania%20Ave&citystatezip=20500 

レスポンスがXMLフォーマットされているが、それは言います次

Error: this account is not authorized to execute this API call

あなたのコード上で正確に同じ要求が応答nullを与えます。これは、エラーと通常のストリームが同じではないためです。クロムは、通常のストリームがヌルであるが、コードを手動で行う必要があると判断したときに、ウィンドウにエラーをルーティングできます。

PS:APIのリクエストを最初にテストするには、postmanを使用する必要があります。その後、あなたがそれが動作すると確信しているURLでそれをテストした後、あなたのプログラムでそれをテストしてください。

+0

こんにちはXavier。あなたの返答をありがとう、私は後半まで続くでした。 「エラーと通常のストリームが同じではない」とはどういう意味ですか?そして、「エラー:このアカウントはこのAPIコールを実行する権限がありません」と言ったとき、私はZillowにより高いレベルのアカウントを要求する必要があることを示していますか? –

+0

はい。あなたの問題はあなたのアカウントにあると思います。また、エラーストリームにアクセスするには、コード化したコードから、最も簡単なのがアンドロイドSDKのHttpURLConnectionを使用することです。私はあなたにそのドキュメンテーションを見てみましょう。 –

関連する問題