2014-11-02 2 views
4

мне было интересно, если кто-нибудь может сказать мне, почему я получаю плохую ошибку запроса при попытке выполнить услугу RESTfull с помощью дооснащенияAndroid дооснащения ошибка при построении запроса

Ошибка: HTTP/1.1 400 Bad Request

Вот мои два класса:

RetrofitInterface:

public class RetrofitInterface { 
    private static StockApiInterface sStockService; 

    public static StockApiInterface getStockApiClient() { 
     if (sStockService == null) { 
      RestAdapter restAdapter = new RestAdapter.Builder() 
        .setEndpoint("http://query.yahooapis.com/v1/public") 
        .build(); 
      sStockService = restAdapter.create(StockApiInterface.class); 
     } 

     return sStockService; 
    } 

    public interface StockApiInterface { 
     @GET("/yql") 
     void listQuotes(@Query("q") String query,Callback<Stock> stockInfo); 
    } 


} 

Asyntask в MainActivity

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

    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     RetrofitInterface.getStockApiClient().listQuotes("select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(\"AIB.IR\")%0A%09%09&format=json&diagnostics=true&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=", new Callback<Stock>() { 


      @Override 
      public void failure(RetrofitError arg0) { 
       // TODO Auto-generated method stub 
       arg0.printStackTrace(); 
      } 

      @Override 
      public void success(Stock arg0, Response arg1) { 
       // TODO Auto-generated method stub 

      } 
     }); 

    } 

} 

Результат всегда неудачный. Первоначально я думал, что проблема заключается в том, что встроенный в gson конвертер Retrofit испытывает трудности с преобразованием ответа на объект запаса, поскольку я получал ответ «Retrofit.retrofiterror». Однако ответ «Bad Request» заставил меня думать, что проблема в . URL-адрес для апи Вот мой желаемый URL ответа:

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AIB.IR%22)%0A%09%09&format=json&diagnostics=true&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=

Может кто-нибудь сказать мне, если я правильно строить это в моем коде Одним из возможной проблемы в том, что я убегаю мои цитаты в запросе. Может быть, это вызывает проблемы?

На всякий случай я выложу свой складской объект. Я написал это с помощью онлайн-POJO преобразователь

public class Stock { 

    @Expose 
    private Query query; 

    public Query getQuery() { 
     return query; 
    } 


    public void setQuery(Query query) { 
     this.query = query; 
    } 

} 

Любая помощь на этом была бы весьма признательна.

+0

Добавить регистрацию в Модернизацию, чтобы увидеть точный запрос, который он делает. Вы можете сделать это, добавив в ваш RestAdapter файл .setLogLevel (RestAdapter.LogLevel.FULL). – michaelcarrano

+0

Кроме того, поскольку вы используете обратный вызов в своем запросе, нет необходимости вставлять его в AsyncTask. – michaelcarrano

+0

Не избегайте строки запроса YQL. Используйте его, как если бы вы использовали необработанную строку SQL. –

ответ

1

Вы пытаетесь использовать один параметр строки запроса вместо нескольких. Это не сработает, пожалуйста, обратитесь к this question. Кроме того, нет необходимости кодировать содержимое запроса, Переоборудование будет делать это автоматически (см docs):

значения параметров URL кодируются по умолчанию. Задайте encodeValue = false, чтобы изменить это поведение.

+0

Хорошо, я прошу api и получить ответ json. Однако преобразование его в объект меня сбивает с толку, потому что json так многословен. https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AIB.IR%22%2C%22BIR. IR% 22)% 0A% 09% 09 & format = json & diagnostics = true & env = http% 3A% 2F% 2Fdatatables.org% 2Falltables.env & callback = Это api. В любом случае добавить параметр в url, чтобы просто вернуть массив «result», так как это все, что мне нужно? –

+1

Конечно, просто удалите «& diagnostics = true», информации будет меньше. –

+0

Вы можете отображать только те поля, которые вам нужны, из вашего ответа JSON. Просто создайте поля с тем же именем, а геттеры/сеттеры для них в вашем классе –

Смежные вопросы