API поиска Bing не возвращает результаты в Android - PullRequest
0 голосов
/ 20 февраля 2019

Я недавно пытался внедрить следующий код в тестовый проект Android Studio, и я понятия не имею, почему я не работаю.Я даже не могу заставить его выводить полезные сообщения об ошибках, которые могут подсказать мне, чтобы выяснить, что не так.Здесь я включил класс AsyncTask, MainActivity и вспомогательный класс, который я использую для анализа данных.Любая помощь будет принята с благодарностью.

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ

public class MainActivity extends AppCompatActivity {

    // Enter a valid subscription key.
    static String subscriptionKey = "######################";

    static String host = "https://api.cognitive.microsoft.com";
    static String path = "/bing/v7.0/videos/search";
    static String searchTerm = "dog";
    static BingSearchResults.Result[] searchResults;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BingSearchTask.Callback callback = new BingSearchTask.Callback() {
            @Override
            public void onComplete(Object o, Error error) {
                BingSearchResults results = (BingSearchResults) o;

                searchResults = results.d.results;
            }
        };

        new BingSearchTask(searchTerm, 1, callback);
    }
}

КЛАСС ASYNC TASK

public class BingSearchTask extends AsyncTask<Void, Void, Void> {

    private final String TAG = getClass().getName();

    private String mSearchStr;
    private int mNumOfResults = 0;

    private Callback mCallback;
    private BingSearchResults mBingSearchResults;
    private Error mError;

    public BingSearchTask(String searchStr, int numOfResults, Callback callback) {
        mSearchStr = searchStr;
        mNumOfResults = numOfResults;
        mCallback = callback;
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            String searchStr = URLEncoder.encode(mSearchStr);
            String numOfResultsStr = mNumOfResults <= 0 ? "" : "&$top=" + mNumOfResults;
            String bingUrl = "https://api.datamarket.azure.com/Bing/SearchWeb/v1/Web?Query=%27" + searchStr + "%27" + numOfResultsStr + "&$format=json";
            String accountKey = "######################";

            Log.d("here", "here");

            byte[] accountAccess = ("accountKey:" + accountKey).getBytes();
            byte[] accountKeyBytes = Base64.encode(accountAccess, Base64.DEFAULT);

            String accountKeyEnc = new String(accountKeyBytes);

            URL url = null;
            url = new URL(bingUrl);

            URLConnection urlConnection = url.openConnection();
            urlConnection.setRequestProperty("Authorization", "Basic " + accountKeyEnc);
            InputStream response = urlConnection.getInputStream();
            String res = readStream(response);

            Gson gson = (new GsonBuilder()).create();
            mBingSearchResults = gson.fromJson(res, BingSearchResults.class);

            Log.d(TAG, res);
            //conn.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
            mError = new Error(e.getMessage(), e);
            Log.e("BingSearchTask", e.getMessage());
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        if (mCallback != null) {
            mCallback.onComplete(mBingSearchResults, mError);
        }

    }

    private String readStream(InputStream in) {
        BufferedReader reader = null;
        StringBuilder sb = new StringBuilder();
        try {
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                //System.out.println(line);
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();


    }

    public interface Callback {
        void onComplete(Object o, Error error);
    }
}

HELPER CLASS

public class BingSearchResults {

    public ResultsContent d;

    public static class ResultsContent {
        public Result[] results;
        public String __next;
    }

    public static class Result {
        public String ID;
        public String Title;
        public String Description;
        public String DisplayUrl;
        public String Url;
        public Metadata __metadata;

    }

    public static class Metadata {
        public String uri;
        public String type;
    }

    public Result[] getResults(){
        if (d == null)
            return null;
        return d.results;
    }

    public String getNextUrl(){
        if (d == null)
            return null;
        return d.__next;
    }

    public boolean isEmpty(){
        return (d == null || d.results == null || d.results.length == 0);
    }

    public int size(){
        if (d == null || d.results == null)
            return 0;
        return d.results.length;
    }
}

1 Ответ

0 голосов
/ 01 марта 2019

В соответствии с предложением других, попробуйте сначала обратиться к API в Postman.Обратите внимание, что SubscriptionKey отображается на вкладке «Заголовки» и имеет имя «Ocp-Apim-Subscription-Key»

enter image description here

...