如何使用JSONP,Ajax和jquery读取数据?

时间:2017-01-28 17:41:04

标签: javascript jquery ajax jsonp

我正在尝试从此API读取数据,但它无法正常工作,我有一个输入框,我输入isbn数字,然后使用jsonp获取数据。您是否可以帮助我确定我的错误("无法读取属性'未定义的#34;)是什么?

function add(){
        var isbn = parseInt($("#isbn").val());
        var list = $("#list");
        console.log(parseInt(isbn));

        $.ajax({
            url: "https://openlibrary.org/api/books?bibkeys=" + isbn + "&jscmd=details&callback=mycallback",
            dataType: "jsonp",
            success: function(isbn){
                var infoUrl = isbn.info_url;
                var thumbnailUrl = isbn.thumbnail_url;
                var title = isbn.details.title;
                var publishers = isbn.details.publishers;
                var isbn13 = isbn.details.isbn_13;


                console.log(isbn.info_url);
                              }
        });
    }

2 个答案:

答案 0 :(得分:1)

Open Library's API期望bibkeys以其类型和冒号为前缀,而不仅仅是数字:

function add(){
    var isbn = 'ISBN:' + $("#isbn").val();
    // ...

冒号也意味着值应该是URL编码的,jQuery可以为你做:

$.ajax({
    url: "https://openlibrary.org/api/books?jscmd=details&callback=?",
    data: { bidkeys: isbn },
    dataType: "jsonp",

然后,它返回的数据会重用您提供的bibkeys属性:

{ "ISBN:0123456789": { "info_url": ..., "details": { ... }, ... } }

要访问图书的信息,您必须先访问此图标:

success: function(data){
    var bookInfo = data[isbn];

    console.log(bookInfo.details.title);
    // etc.
}

示例:https://jsfiddle.net/3p6s7051/

您还可以使用bibkey

从对象本身检索Object.keys()
success: function (data) {
    var bibkey = Object.keys(data)[0];
    var bookInfo = data[bibkey];

    console.log(bookInfo.details.title);
    // ...
}
  

注意:您可以使用此方法进行验证,因为请求在技术上可以成功并且不包含任何书籍信息(即未找到匹配项):

success: function (data) {
    var bibkeys = Object.keys(data);

    if (bibkeys.length === 0)
        return showError('No books were found with the ISBN provided.');

    // ...

示例:https://jsfiddle.net/q0aqys87/

答案 1 :(得分:0)

我问了一位教授,这就是她告诉我解决问题的方法:

function add(){
    var isbn = parseInt($("#isbn").val());
    var list = $("#list");
    console.log(parseInt(isbn));

    $.ajax({
        url: "https://openlibrary.org/api/books?bibkeys=" + isbn + "&jscmd=details&callback=mycallback",
        dataType: "jsonp",
        success: function(data){
            var thumb=data["ISBN:"+isbn+""].thumbnail_url;
             ....
       }
    });
}