Android Retrofit构建请求时出现错误

4

我想知道为什么在使用Retrofit执行RESTful服务时,我会收到一个错误的请求错误。

错误:HTTP / 1.1 400错误请求

这是我的两个类:

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);
    }


}

在MainActivity中的Asyntask

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

            }
        });

    }

}

结果总是失败。最初我认为问题在于Retrofit内置的gson转换器无法将响应转换为股票对象,因为我只收到了一个“Retrofit.retrofiterror”响应。然而,“错误请求”的响应让我认为问题在于API的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;
    }

}

任何关于此事的帮助将不胜感激。


将日志记录添加到Retrofit中,以查看其正在进行的确切请求。您可以通过向RestAdapter添加.setLogLevel(RestAdapter.LogLevel.FULL)来实现此目的。 - michaelcarrano
另外,由于您在请求中使用了回调函数,因此无需将其放入AsyncTask中。 - michaelcarrano
不要转义你的YQL查询字符串。像使用原始SQL字符串一样使用它。 - IgorGanapolsky
1个回答

2
您正在尝试使用一个查询字符串参数而不是多个。这样做是行不通的,请参考此问题。 另外,没有必要对查询内容进行编码,Retrofit会自动完成(请参阅文档):

默认情况下,参数值会进行URL编码。指定encodeValue=false可以更改此行为。


好的,我正在请求API并获取JSON响应。但是将其转换为对象令我感到困惑,因为JSON非常冗长。这是API链接: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=有没有办法向URL添加参数,以便只返回“result”数组,因为这就是我需要的? - David Gordon
1
当然可以,只需删除“&diagnostics=true”,就会减少信息。 - Vadim Kotov
你可以仅映射你需要的JSON响应字段。只需在你的类中创建与字段同名的属性,并为它们创建 getter/setter 即可。 - Vadim Kotov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接