Retrofit2 с параметром запроса, который не работает

У меня есть следующий ответ json с некоторыми книгами.

[
 {
"title" : "Clean Code",
"author" : "Robert Martin",
"bookUrl" : "http://amzn.to/1DJybxH",
"imageUrl" : "http://adavis.github.io/adept-android/images/clean_code.jpg",
"displayDate" : "August 11, 2008",
"numberOfPages" : 464
},

{
"title" : "Effective Java",
"author" : "Joshua Bloch",
"bookUrl" : "http://amzn.to/1Ku8Xel",
"imageUrl" : "http://adavis.github.io/adept-  
 android/images/effective_java.jpg",
"displayDate" : "May 28, 2008",
"numberOfPages" : 346
},

{
"title" : "Working Effectively with Legacy Code",
"author" : "Michael Feathers",
"bookUrl" : "http://amzn.to/1Jqe1PA",
"imageUrl" : "http://adavis.github.io/adept-android/images/legacy_code.jpg",
"displayDate" : "October 2, 2004",
"numberOfPages" : 456
},

{
"title" : "Refactoring: Improving the Design of Existing Code",
"author" : "Martin Fowler",
"bookUrl" : "http://amzn.to/1Lx4cjR",
"imageUrl" : "http://adavis.github.io/adept-android/images/refactoring.jpg",
"displayDate" : "July 8, 1999",
"numberOfPages" : 464
},

{
"title" : "Test Driven Development: By Example",
"author" : "Kent Beck",
"imageUrl" : "http://adavis.github.io/adept-android/images/tdd.jpg",
"displayDate" : "November 18, 2002",
"numberOfPages" : 240
}
]

Теперь я хочу выполнить поисковый запрос и отобразить только те объекты, заголовок которых содержит слово «Код», т.е. «Эффективная работа с устаревшим кодом» и так далее. Вот что я делаю.

public interface BookService {

  @GET("photos/sample_data")
  Call<List<Book>> getBooks();

  @GET("photos/sample_data")
  Call<List<Book>> search( @Query( "q" ) String query );

}

Первый запрос @GET считывает все данные json. Так что эта часть работает. Теперь второй запрос @GET относится к моему методу поиска. Как видите, он содержит параметр запроса.

Затем я вызываю метод enqueue(...) в моем классе Presesenter (я использую MVP). Так

public class BooksPresenter {
private final BooksContract.View booksView;
private final BookService service;

public BooksPresenter(BooksContract.View booksView,BookService service){
    this.booksView = booksView;
    this.service = service;
}

public void initDataSet(){
    service.search("Code").enqueue(new Callback<List<Book>>() {
        @Override
        public void onResponse(Call<List<Book>> call, Response<List<Book>> response) {
            if(response.isSuccessful()){
                booksView.showBooks(response.body());
                Timber.i( "Books data was loaded from API." );

            }
        }

        @Override
        public void onFailure(Call<List<Book>> call, Throwable t) {
            booksView.showErrorMessage();
            Timber.e( t, "Unable to load the books data from API." );
        }
    });
   }
}

Эта строка ищет слово Code.

service.search("Code")...

Тем не менее, я все еще получаю целые книги, и запрос не работает. :(. Любые идеи?

Весь мой URL

http://www.theo-android.co.uk/photos/sample_data

и я объявляю первый бит в отдельном классе.

public class Constants {
  public static final String BASE_URL = "http://www.theo-android.co.uk/";
}

Спасибо,

Тео.

ОБНОВЛЕНИЕ

Я решил создать базу данных и добавлять данные статически! Затем я написал php-скрипт для создания json.

<?php 
 include("init.php");
 $string="";
 $newString="";
 $get_posts = "select * from books_table";

$run_posts = mysqli_query($con,$get_posts); 

 $posts_array = array();

 while ($posts_row = mysqli_fetch_array($run_posts)){


               $row_array['title'] = $posts_row['title'];
               $row_array['author'] = $posts_row['author'];
               $row_array['bookUrl'] = $posts_row['bookUrl'];
               $row_array['imageUrl'] = $posts_row['imageUrl'];
               $row_array['displayDate'] = $posts_row['displayDate'];
               $row_array['numberOfPages'] = $posts_row['numberOfPages'];

               array_push($posts_array,$row_array);

 }

   $string = json_encode($posts_array,JSON_UNESCAPED_UNICODE);

   echo $string;
 ?>

Я изменил URL-адрес на

http://www.theo-android.co.uk/books/sample_data.php

Я получаю json обратно, как показано в начале. Но с этим URL

 www.theo-android.co.uk/books/sample_data.php/q=clean

все еще есть та же проблема. Поэтому я решил проверить свой скрипт и добавил предложение where.

<?php 
 include("init.php");
$string="";
$newString="";
$get_posts = "select * from books_table where title='Clean Code' ";

$run_posts = mysqli_query($con,$get_posts); 

 $posts_array = array();

 while ($posts_row = mysqli_fetch_array($run_posts)){


               $row_array['title'] = $posts_row['title'];
               $row_array['author'] = $posts_row['author'];
               $row_array['bookUrl'] = $posts_row['bookUrl'];
               $row_array['imageUrl'] = $posts_row['imageUrl'];
               $row_array['displayDate'] = $posts_row['displayDate'];
               $row_array['numberOfPages'] = $posts_row['numberOfPages'];

               array_push($posts_array,$row_array);

  }

   $string = json_encode($posts_array,JSON_UNESCAPED_UNICODE);

   echo $string;
 ?>

И угадайте, что. Я все еще получаю весь ответ json !!!


person Theo    schedule 22.11.2016    source источник
comment
из любопытства, почему вы назвали конечную точку photos, когда она возвращает книги? Я попытался запросить вашу конечную точку из браузера и получил те же результаты. Либо вы запрашиваете неправильную конечную точку, либо ваш сервер не работает.   -  person Blackbelt    schedule 22.11.2016
comment
@Blackbelt Это была старая папка на моем сервере. Я изменю это. Но этот URL-адрес theo-android.co.uk/photos/sample_data/q=code по-прежнему показывает весь json.   -  person Theo    schedule 22.11.2016
comment
проблема на задней стороне. это не модернизация   -  person Blackbelt    schedule 22.11.2016
comment
Так что это проблема с вашим бэкэндом, а не с запросом на дооснащение.   -  person Przemyslaw Jablonski    schedule 22.11.2016
comment
проверьте с POSTMAN он работает или нет .....   -  person sushildlh    schedule 22.11.2016
comment
@Черный пояс, о боже. Как я могу это исправить? Я не использовал CMS. Я просто скопировал ответ, поскольку он был на моем сервере. Новый ulr: theo-android.co.uk/books/sample/ q=code по-прежнему не работает. можно попробовать :(   -  person Theo    schedule 22.11.2016
comment
Опубликуйте файл с вашего сервера, который используется для создания ответа.   -  person rhari    schedule 22.11.2016
comment
@Арари. У меня нет php-кода, который выполняет запрос и генерирует json. У меня есть только папка с книгами. И внутри этой папки файл с именем sample. Этот файл содержит json. И, следовательно, URL-адрес theo-android.co.uk/books/sample   -  person Theo    schedule 22.11.2016
comment
В этом случае вам придется написать скрипт, который выполняет ваш запрос. Или вы можете искать ответ, который вы получаете на стороне клиента.   -  person rhari    schedule 22.11.2016
comment
Возможно, файл должен иметь исключение, поскольку php. Это дикая догадка. т.е. theo-android.co.uk/books/sample.php   -  person Theo    schedule 22.11.2016


Ответы (2)


попробуй это

@GET("books/sample/")
  Call<List<Book>> search( @Query( "q" ) String query );

вместо этого

@GET("photos/sample_data")
  Call<List<Book>> search( @Query( "q" ) String query );

Примечание: указанный вами URL-адрес в комментарии отличается от используемого вами в методе @Get... http://www.theo-android.co.uk/books/sample/q=code

person sushildlh    schedule 22.11.2016
comment
Я уже пробовал это, но не работает. Я все еще получаю все объекты json :( - person Theo; 22.11.2016
comment
Что значит остановился? - person Theo; 22.11.2016
comment
это означает, что у сервера есть какая-то проблема, когда URL-адрес попадает на сервер, он закрывает сервер, и сервер больше не открывается..... URL НЕ РАБОТАЕТ .... - person sushildlh; 22.11.2016
comment
Я понимаю. Может быть, я должен позвонить провайдеру сервера - person Theo; 22.11.2016

Можете ли вы попробовать этот код для запроса в initDataSet.

List<Book> bookList = service.search("Code");

Возможно, этот код может помочь вам.

person Burak iren    schedule 22.11.2016