如果一个 api returns 为空值,则调用另一个 api

Call another api if one api returns null value

我正在开发一个 Android 应用来卖书。我有一个集成的条码扫描器,我的用户可以使用它扫描他们想要出售的图书的条码。

我可以使用Zxing图书馆的条码获取图书的ISBN号。使用此 ISBN 编号,我从 openlibrary.org API.

中获取数据

现在的问题是,如果 openlibrary 没有那本书数据,我想调用 Google 书籍 API。

尽管 openlibrary 没有 Google 那样多的数据,但我还是使用它的原因是它们提供了高质量的书籍封面图像。 Google 没有可用的数据。

所以现在我需要知道如果 openlibrary 的响应为空,如何调用 Google 的 API。

这是我的完整代码:

package com.example.gaayathri.barcodetest;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class MainActivity extends AppCompatActivity {

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

        Button button = this.findViewById(R.id.button);
        final Activity activity = this;
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ImageView ivBookImage = findViewById(R.id.ivBookImage);
                ivBookImage.setImageBitmap(null);

                TextView tvTitle = findViewById(R.id.tvTitle);
                tvTitle.setText("");

                TextView tvAuthor = findViewById(R.id.tvAuthor);
                tvAuthor.setText("");


                IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
                integrator.setPrompt("Scan a barcode");
                integrator.setCameraId(0);  // Use a specific camera of the device
                integrator.setOrientationLocked(true);
                integrator.setBeepEnabled(true);
                integrator.setCaptureActivity(CaptureActivityPortrait.class);
                integrator.initiateScan();
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
            if(result.getContents() == null) {
                Log.d("MainActivity", "Cancelled scan");
                Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
            } else {
                Log.d("MainActivity", "Scanned");
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();

                final String isbn = result.getContents();

                String bookOpenApi = "https://openlibrary.org/api/books?bibkeys=ISBN:" + isbn + "&jscmd=data&format=json";

                //String bookSearchString = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn;

                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()
                        .url(bookOpenApi)
                        .build();

                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, final Response response) throws IOException {
                        // ... check for failure using `isSuccessful` before proceeding

                        // Read data on the worker thread
                        final String responseData = response.body().string();

                        // Run view-related code back on the main thread
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                JSONObject resultObject = null;

                                try {

                                    resultObject = new JSONObject(responseData);

                                    JSONObject isbnObject = resultObject.getJSONObject("ISBN:" + isbn);

                                    String TitleL = isbnObject.getString("title");

                                    if (TitleL.length()!=0){

                                        Toast.makeText(MainActivity.this, "Title length = " + TitleL.length(), Toast.LENGTH_SHORT).show();

                                        try{
                                            TextView tvTitle = findViewById(R.id.tvTitle);
                                            tvTitle.setText("TITLE: "+isbnObject.getString("title"));
                                        }
                                        catch(JSONException jse){
                                            TextView tvTitle = findViewById(R.id.tvTitle);
                                            tvTitle.setText("");
                                            jse.printStackTrace();
                                        }

                                        try{

                                            JSONArray authors = isbnObject.getJSONArray("authors");
                                            JSONObject author = authors.getJSONObject(0);

                                            String authorName = author.getString("name");

                                            TextView tvAuthor = findViewById(R.id.tvAuthor);
                                            tvAuthor.setText("AUTHOR(S): "+ authorName);
                                        }
                                        catch(JSONException jse){
                                            TextView tvAuthor = findViewById(R.id.tvAuthor);
                                            tvAuthor.setText("");
                                            jse.printStackTrace();
                                        }

                                        try{

                                            JSONObject imageObject = isbnObject.getJSONObject("cover");

                                            String imageUrl = imageObject.getString("large");

                                            ImageView ivBookImage = findViewById(R.id.ivBookImage);

                                            Glide.with(MainActivity.this).load(imageUrl).into(ivBookImage);
                                        }
                                        catch(JSONException jse){

                                            Toast.makeText(MainActivity.this, "No book image available", Toast.LENGTH_SHORT).show();
                                            jse.printStackTrace();
                                        }

                                    } else {

                                        String bookSearchString = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn;

                                        OkHttpClient client = new OkHttpClient();

                                        Request request = new Request.Builder()
                                                .url(bookSearchString)
                                                .build();

                                        client.newCall(request).enqueue(new Callback() {
                                            @Override
                                            public void onFailure(Call call, IOException e) {

                                            }

                                            @Override
                                            public void onResponse(Call call, Response response) throws IOException {

                                                final String googleResponseData = response.body().string();

                                                MainActivity.this.runOnUiThread(new Runnable() {
                                                    @Override
                                                    public void run() {

                                                        JSONObject resultObject = null;

                                                        try {

                                                            resultObject = new JSONObject(googleResponseData);

                                                            JSONArray items = resultObject.getJSONArray("items");

                                                            JSONObject volumeInfo = items.getJSONObject(0);

                                                            JSONObject volumeObject = volumeInfo.getJSONObject("volumeInfo");

                                                            String TitleL = volumeObject.getString("title");

                                                            TextView tvTitle = findViewById(R.id.tvTitle);

                                                            tvTitle.setText(TitleL);

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

                                                        try {

                                                            JSONArray items = resultObject.getJSONArray("items");

                                                            JSONObject volumeInfo = items.getJSONObject(0);

                                                            JSONObject volumeObject = volumeInfo.getJSONObject("volumeInfo");

                                                            JSONArray authorsArray = volumeObject.getJSONArray("authors");

                                                            String authorName = authorsArray.getString(0);

                                                            TextView tvAuthor = findViewById(R.id.tvAuthor);
                                                            tvAuthor.setText("AUTHOR(S): "+ authorName);


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

                                                    }
                                                });

                                            }
                                        });

                                    }

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

                            }
                        });
                    }
                });

            }
        } else {
            // This is important, otherwise the result will not be passed to the fragment
            super.onActivityResult(requestCode, resultCode, data);
        }
    }


}

好的,我通过使用 EditText 字段作为关键字段解决了这个问题。所以想法是用条形码扫描器返回的 ISBN 号调用 openlibrary API 并填充 Simple drawee viewTitle EdittextAuthor Edittext.

然后检查 Title Edittext 字段是否已填充。如果它被填充,则意味着 OpenLibrary API 已返回有效数据。如果 Title Edittext 为空,调用 Google's books API.

OnActivityResult()函数的完整源代码如下所示:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    final IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(result != null) {
        if(result.getContents() == null) {
            Log.d("MainActivity", "Cancelled scan");
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
        } else {
            Log.d("MainActivity", "Scanned");
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // This function will fetch the data from openlibrary API
                    checkinOpenLibrary(result.getContents());

                    EditText tvTitle = findViewById(R.id.etMaterialTitle);
                    if (tvTitle.getText().length() == 0) {
                        // This function will fetch the data from Google's books API
                        checkinGoogleAPI(result.getContents());
                    }

                }
            });

        }
    } else {
        // This is important, otherwise the result will not be passed to the fragment
        super.onActivityResult(requestCode, resultCode, data);
    }