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)

Spring REST APIandを使用して同等の Java プログラムを作成しようとApache 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

Google の HTTP クライアントを見てください。

からわかるように、オブジェクトを使用してリクエスト URL を構築し、レスポンス本文を逆シリアル化します。このドキュメントでは、JSON を具体的に逆シリアル化する方法も示しており、JSON ライブラリを選択できます。

于 2013-05-28T10:34:33.500 に答える
0

GSONMapのような外部jarを使用して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 に答える