我正在尝试使用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
);
}
}
答案 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绝对正确,你需要拆分它们。