Retrofit 2.0返回的URL不正确

时间:2016-07-05 21:30:13

标签: android retrofit retrofit2

我正在尝试使用Retrofit 2.0构建我的网址。问题是它返回此URL:

http://query.yahooapis.com/v1/public/yql?&q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)&format=json%26diagnostics%3Dtrue%26env%3Dstore%253A%252F%252Fdatatables.org%252Falltableswithkeys%26callback%3D

我希望它返回此网址:

https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=

任何人都可以建议我如何解决这个问题?

以下是返回网址的代码:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

mQuoteAdapter = new QuoteAdapter(items);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.question_list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(mQuoteAdapter);

StockApiServiceInterface stockApiServiceInterface = retrofit.create(StockApiServiceInterface.class);

stockApiServiceInterface.listQuotes(
        "select * from yahoo.finance.quotes where symbol in (\"YHOO\")",
        "json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=")
        .enqueue(new Callback<ResultWrapper>() {
          @Override
          public void onResponse(Response<ResultWrapper> response) {
              response.body().getQuery().getResults().getQuote().getAsk();
          }

          @Override
          public void onFailure(Throwable t) {
            Log.e("listQuotes threw: ", t.getMessage());
          }
        });

这是我的StockApiService:

public final class StockApiService {

  public interface StockApiServiceInterface {

    @GET("v1/public/yql?")
    Call<ResultWrapper> listQuotes(
            @Query("q") String query,
            @Query("format") String env
    );
  }
}

2 个答案:

答案 0 :(得分:3)

从您的请求网址中删除问号,如下所示:

@GET("v1/public/yql")

并分开您在此处发送的参数:

"json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=")

进入查询项目。 你的方法应该是这样的:

@Query("q") String query,
@Query("format") String format,
@Query("diagnostics") boolean diagnostics,
@Query("env") String enviroment,
@Query("callback") boolean callback

答案 1 :(得分:1)

从Ian略微改变,简化了一点:

public final class StockApiService {
  public interface StockApiServiceInterface {
    @GET("v1/public/yql?format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys")
    Call<ResultWrapper> listQuotes(
        @Query("q") String query,
        @Query("diagnostics") boolean diagostics
    );
  }
}

不变的查询字符串参数可以包含在方法注释中,并且改进应该将它们合并在一起。此外,我删除了callback参数,因为这对于名为JSONP的网站来说是一件事,并且与Android应用程序无关。

您遇到的实际问题是您正在为Retrofit提供一个预先组合的部分查询字符串,并要求它为您编码。 Retrofit不知道它是一个预先组合的查询字符串,所以它做了它应该做的事情:将它视为查询字符串参数的值并且URL对其进行编码。 @Ian绝对正确,你需要拆分它们。