1

我需要用 Java 调用这个服务——

https://api.semantics3.com/test/v1/products?q={"cat_id": "13658", "brand": "Toshiba", "model": "Satellite"}

我已经设法在python中做到这一点,如下所示 -

class Semantics:
    def __init__(self): 
        self.service_address = 'https://api.semantics3.com/test/v1/products?'
        self.api_key = 'SEM3158A71D4AB3A3715C2230B96943F46D0'
    def query(self, params):
        query = 'q=' + params.__dict__.__str__().replace("'",'"')
        query = urlencode(urlparse.parse_qs(query), True)
        req = Request(url = self.service_address + query)
        req.add_header('api_key', self.api_key)        
        return urlopen(req).read()

class QueryParams:
    def __init__(self, cat_id, model, brand):
        self.cat_id = cat_id
        self.model = model
        self.brand = brand

qp = QueryParams('13658', 'Satellite', "Toshiba")
print Semantics().query(qp)

我曾尝试使用编写等效的 Java 程序Spring REST APIApache HttpClient但无济于事。我找不到将字典(即地图)设置到查询字符串中的方法。

public static void main(String[] args) {
    String uri = "https://api.semantics3.com/test/v1/products?";

    HttpClient hc = new HttpClient();
    GetMethod method = new GetMethod(uri);

    method.getParams().setParameter("q", "Toshiba");//How do I insert a Map here?

    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
            new DefaultHttpMethodRetryHandler(3, false));

    method.setRequestHeader("api_key", "SEM2158A71D4AB3A3715C2435B96943F46D0");     
    try {
        int statusCode = hc.executeMethod(method);
        System.out.println(statusCode);
        byte[] responseBody = method.getResponseBody();
        System.out.println(new String(responseBody));
    } catch (HttpException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        method.releaseConnection();
    }
}

在最低级别,我可以通过连接手动生成查询字符串,然后通过 Url 对其进行编码。但是有没有更优雅的方法呢?

4

2 回答 2

0

我认为您可以使用像GSON这样的外部 jar 将其转换Map为 JSON

Map<String, String> map = new HashMap<String,String>();
map.put("cat_id", "12345");

..

Gson gson = new Gson();
method.getParams().setParameter("q", gson.toJson(map));
于 2013-05-28T10:31:22.303 回答
0

看看Google 的 Http 客户端

示例中可以看出,它使用对象来构建请求 url 并反序列化响应正文。文档还向您展示了如何专门反序列化 JSON,您可以选择您选择的 JSON 库。

于 2013-05-28T10:34:33.500 回答