代码之家  ›  专栏  ›  技术社区  ›  Karthic Srinivasan

如果一个api返回空值,则调用另一个api

  •  -1
  • Karthic Srinivasan  · 技术社区  · 6 年前

    现在的问题是,如果openlibrary没有图书数据,我想调用googlebooksapi。

    所以现在我需要知道如果openlibrary的响应为null,如何调用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);
            }
        }
    
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Karthic Srinivasan    6 年前

    好吧,我用一个 EditText 字段作为键字段。所以我们的想法是 openlibrary 带有条形码扫描仪返回的ISBN号的API,并填充 Simple drawee view Title Edittext Author Edittext .

    然后检查 标题编辑文本 字段是否已填充。如果有人居住,那就意味着 OpenLibrary API已返回有效数据。如果 标题编辑文本 是空的,呼叫 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);
        }