无法使用swagger api生成的客户端

时间:2017-01-17 17:34:52

标签: api error-handling connection swagger

我正在尝试在项目中使用第三方API,以便以虚张声势提供访问这些api的方式

当我使用swagger生成客户端并尝试在我的本地使用时,我收到错误

io.swagger.client.ApiException: java.net.SocketTimeoutException: connect timed out
    at io.swagger.client.ApiClient.execute(ApiClient.java:973)
    at io.swagger.client.api.PlatformApi.getAppsWithHttpInfo(PlatformApi.java:729)
    at io.swagger.client.api.PlatformApi.getApps(PlatformApi.java:716)
    at io.swagger.client.api.testSample.getNodesTest(testSample.java:16)
    at io.swagger.client.api.testSample.main(testSample.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.net.SocketTimeoutException: connect timed out
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at com.squareup.okhttp.internal.Platform.connectSocket(Platform.java:120)
    at com.squareup.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:141)
    at com.squareup.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
    at com.squareup.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
    at com.squareup.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
    at com.squareup.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
    at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
    at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
    at com.squareup.okhttp.Call.getResponse(Call.java:286)
    at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243)
    at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205)
    at com.squareup.okhttp.Call.execute(Call.java:80)
    at io.swagger.client.ApiClient.execute(ApiClient.java:969)
    ... 9 more

我正在尝试使用生成的客户端中的一种方法,如下所示

package io.swagger.client.api;

import com.squareup.okhttp.OkHttpClient;
import io.swagger.client.ApiClient;
import io.swagger.client.ApiException;
import io.swagger.client.Configuration;
import io.swagger.client.model.AppModel;
import io.swagger.client.model.NodeModel;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class testSample {
    private final PlatformApi api = new PlatformApi();
    public void getNodesTest() throws ApiException {
        List<AppModel> response = api.getApps();
        System.out.print("------------------------inside testsample------------------------");
        System.out.print(response);
    }

    public static void main(String args[]){
        testSample t1=new testSample();
        System.out.print("------------------------inside main------------------------");
        try{
            ApiClient defaultApiClient = Configuration.getDefaultApiClient();
            ApiClient apiClient = t1.api.getApiClient();
            System.out.println(defaultApiClient);
            System.out.println(apiClient);
            t1.getNodesTest();
        }
        catch(Exception e){
            System.out.println("inside exeption");
            e.printStackTrace();
        }



    }
}

请提供一些建议如何在本地

中使用swagger生成的java客户端

2 个答案:

答案 0 :(得分:8)

我希望这些可以帮助某人;

DefaultApi defaultApi = new DefaultApi();
ApiClient apiClient = new ApiClient();
apiClient.setBasePath("http://....");
apiClient.addDefaultHeader("Authorization", "bearer TOKEN");
OkHttpClient httpClient = apiClient.getHttpClient();
httpClient.setConnectTimeout(60, TimeUnit.SECONDS);
httpClient.setReadTimeout(60, TimeUnit.SECONDS);
httpClient.setWriteTimeout(60, TimeUnit.SECONDS);
defaultApi.setApiClient(apiClient);

SomeModel var1 = defaultApi.getNodesTest();

generator sample命令;

> java -jar swagger-codegen-cli-2.2.2.jar generate -l java -o myModule --library okhttp-gson -i http://..../swagger

下载jar文件;

http://central.maven.org/maven2/io/swagger/swagger-codegen-cli/

了解更多信息;

https://github.com/swagger-api/swagger-codegen

答案 1 :(得分:2)

以下错误表明Java API客户端无法连接到API服务器:

io.swagger.client.ApiException: java.net.SocketTimeoutException: connect timed out

我建议您验证Swagger / OpenAPI规范,以确保其设置正确host,例如:

host: petstore.swagger.io

e.g。 https://github.com/swagger-api/swagger-codegen/blob/master/modules/swagger-codegen/src/test/resources/2_0/petstore.yaml#L12

参考:Swagger 2.0规范:https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#swagger-object