问题标签 [apiman]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
22 浏览

apiman - 通过 GUI 在 ApiMan 中删除 polictDef

我添加Policy Definition错误,而是将其添加为 custom Plugin

现在,如果我尝试添加插件,它会抱怨name 的插件已经存在。只有更新策略的选项,如果我尝试设置"deleted": true。它根本没有更新,因为我可以看到配置保持不变。

我怎样才能删除它policy definition并将其安装为plugin. 我想我可以更改为 new"id"并将其添加为plugin. 可能吗 ?但是有没有办法policy直接删除呢?

编辑:我可以在 ES 注册表中将"id"它添加为带有新的插件。primary key但仍然找不到删除它的方法。policydefs存储在系统中的什么位置?我们可以使用 ES 查询删除吗?

0 投票
1 回答
470 浏览

java - Apiman 不恢复网关

您能否帮助我解决以下问题。我使用 Apiman 1.2.1 版

我通过 kubernetes 公开这个版本,作为我在同一个容器中使用 postgres 的持久卷。一旦我第一次创建它,之后在 apiman 中我添加了 Organization/API/.... 和所有必要的人员。

我按下按钮发布 api,并可能检查它是否完美运行,因此我使用kubectl port-forward pod-name 8080:8080并可能通过浏览器检查我的网关http:localhost:8080/apiman-gateway/ORgId/bla/bla/bla/bla?givemedescriptionbyid=1

在这之后我去控制台并杀死 apiman pod,作为 pod 重启的结果,同样的操作kubectl port-forward new-pod-name 8080:8080,我可以看到 apiman 的所有数据,如组织、apis 和所有其他人员都已经存在。

但是,如果您再次尝试调用网关,则会出现一个大问题,它会告诉您:

{"responseCode":500,"message":"API not found.","trace":"io.apiman.gateway.engine.beans.exceptions.InvalidApiException: API not found.\n\tat io.apiman.gateway .engine.impl.ApiRequestExecutorImpl$3.handle(ApiRequestExecutorImpl.java:278)\n\tat io.apiman.gateway.engine.impl.ApiRequestExecutorImpl$3.handle(ApiRequestExecutorImpl.java:271)\n\tat io.apiman.gateway .engine.impl.SecureRegistryWrapper$1.handle(SecureRegistryWrapper.java:122)\n\tat io.apiman.gateway.engine.impl.SecureRegistryWrapper$1.handle(SecureRegistryWrapper.java:111)\n\tat io.apiman.gateway .engine.es.CachingESRegistry.getApi(CachingESRegistry.java:116)\n\tat io.apiman.gateway.engine.impl.SecureRegistryWrapper.getApi(SecureRegistryWrapper.java:111)\n\tat io.apiman.gateway.engine .impl.ApiRequestExecutorImpl。执行(ApiRequestExecutorImpl.java:270)\n\tat io.apiman.gateway.platforms.servlet.GatewayServlet.doAction(GatewayServlet.java:232)\n\tat io.apiman.gateway.platforms.servlet.GatewayServlet.doGet( GatewayServlet.java:77)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:687)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\n\tat io.undertow。 servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\n\tat org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)\n\tat io.undertow.server。handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)\n\tat io.undertow.servlet.handlers.security。 ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler. java:46)\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) \n\tat io.undertow.servlet。handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)\n\tat io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)\n\tat io.undertow.security.handlers.SecurityInitialHandler。 handleRequest(SecurityInitialHandler.java:76)\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest( JACCContextIdHandler.java:61)\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) \n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)\n\tat io.undertow。servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)\n\tat io.undertow.servlet.handlers.ServletInitialHandler $1.handleRequest(ServletInitialHandler.java:172)\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774 )\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang .Thread.run(Thread.java:745)\n"}访问$000(ServletInitialHandler.java:80)\n\tat io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java: 199)\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util .concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang.Thread.run(Thread.java:745)\n"}访问$000(ServletInitialHandler.java:80)\n\tat io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java: 199)\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util .concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang.Thread.run(Thread.java:745)\n"}ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang.Thread.run(Thread.java:745) \n"}ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang.Thread.run(Thread.java:745) \n"}

我可以看到,通过 api manager 中的调用指标,我所有的调用都可以到达 apiman-gateway,但我得到了 500 个响应代码。

0 投票
0 回答
203 浏览

api - 如何通过 APIMAN Policy 更改 Host 标头请求

我有一个关于如何-H "Host: my.host.com"从网关配置到我的 api 的问题。所以,我有以下逻辑:

  • 我尝试覆盖,例如my-api.net通过 apiman-gateway。

  • 例如,我可以对我的 api 进行以下直接调用,例如'curl -X GET --header 'Accept: */*' -H "Host: www.google.com" 'http://my-api.net/accounts?accountNumber=12314123'.

  • 基于这个调用,我的 api 会知道,例如,我的消费者是谷歌。但是一旦我尝试通过 apiman-gateway 进行调用'curl -X GET --header 'Accept: */*' -H "Host: www.google.com" 'http://apiman-gateway/GoogleOrganization/API/V1/accounts?accountNumber=12314123',主机就无法通过,并且我的 api 的实现告诉我它不知道任何主机名,例如已经部署my-api.net。可能有人可以告诉我如何通过策略进行设置,可能只是为了使用上面的主机参数从 apiman-gateway 调用我的 api?

  • 提前感谢你的帮助

0 投票
2 回答
388 浏览

mysql - APIMan 与 Tomcat 和 MySQL

我是 APIMan 的新手。我已经用 Apache Tomcat 实例配置了 apiman-tomcat-final-distro。现在因为它使用默认作为 APIMan 的 H2 数据库,我想用它来配置 MySQL 数据库。

RedHat APIMan 页面上提供了一些文档,但它们不清楚且没有正确说明。

任何循序渐进的方法,即 Blogger 或 Tutorial 都会有很大帮助。

谢谢。

0 投票
1 回答
575 浏览

apiman - 如何在 apiman 中本地测试 API?

期望的行为

我想在本地测试一个 apiman API 以查看apiman-quickstarts/echo-service的响应(或者如果这在最新版本的 apiman 中不再适用,那么任何 echo 响应都会很棒)。

我试过的

我使用来自官方 apiman 站点apiman的以下内容进行安装: Ubuntu 17.10

使用 apiman GUI ( localhost:8080/apimanui/api-manager),我创建了一个Organisation、一个Public API没有API Security、一个Endpoint任意定义为http://localhost:8080/apiman-echo和一个Client App。由于 API 被定义为Public,我的理解是不需要ContractClient App. 该Managed EndpointAPI 在 GUI 中提供为:

实际行为

这些是卷曲结果:

速成课程文档 ( apiman.io/latest/crash-course.html ) 指出以下是 apiman 文件夹的内容,但是在我的电脑上quickstartswildfly-10.1.0.Final文件夹中搜索不会返回任何结果:

我觉得我在某处遗漏了几个与“安装”echo-service并使其可用于测试的步骤。

echoapiman.gitbooks.io/apiman-user-guideapiman.gitbooks.io/apiman-production-guide中搜索不会产生任何结果,而apiman.io/latest/developer-guide.html状态:

模拟后端 API 是一个简单的“回声”API,它使用 JSON 有效负载响应所有请求,描述它收到的请求

但我不确定如何解释和利用这些信息。

0 投票
1 回答
215 浏览

wso2 - WSO2 API Manager 2.1.0 源代码

我正在尝试为 API Manager 2.1.0 找到正确版本的源代码。

APIM 2.1.0 包中的 apimgt 包版本为 6.1.66,但在 Git 存储库中找不到。请提供正确版本的链接。

0 投票
1 回答
111 浏览

apiman - Apiman X-Fowarded-For 上的简单标头策略

我想知道是否有某种方法可以在 API Man 的请求标头上添加客户端远程 IP。

我需要添加一个简单的标头策略,其中包含一个包含客户端远程 ip 的“X-Forwarded-For”。

我的后端正在获取 APIMan IP 作为远程客户端,但我需要获取客户端 IP。

0 投票
0 回答
22 浏览

mysql - 调用 APIMAN 的 API 时出错

所以,我刚开始使用 APIMAN 并做了一些配置。我用 BASIC Authentication 创建了一个 API 服务。我使用 JDBC url 作为 jdbc:mysql://localhost:3036/Demo。

然后我创建了一个应用程序服务来使用该 API。但是当我使用 API 端点时,它会给我带来一些错误。

错误:-

{"responseCode":500,"message":"无法获取 jdbcUrl=jdbc:mysql://localhost:3306/?user=root","trace":"java.lang.RuntimeException: 无法获取的驱动程序实例jdbcUrl=jdbc:mysql://localhost:3306/?user=root\n\tat com.zaxxer.hikari.util.DriverDataSource.(DriverDataSource.java:88)\n\tat com.zaxxer.hikari 的驱动程序实例。 pool.PoolElf.initializeDataSource(PoolElf.java:143)\n\tat com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:112)\n\tat com.zaxxer.hikari.HikariDataSource.(HikariDataSource.java: 73)\n\tat io.apiman.gateway.engine.impl.DefaultJdbcComponent.datasourceFromConfig(DefaultJdbcComponent.java:101)\n\tat io.apiman.gateway.engine.impl.DefaultJdbcComponent.createShared(DefaultJdbcComponent.java:58) \n\tat io.apiman.gateway.engine.impl.DefaultJdbcComponent.createStandalone(DefaultJdbcComponent.java:70)\n\tat io.apiman.gateway.engine.policies.auth.JDBCIdentityValidator.createClient(JDBCIdentityValidator.java:126)\n\tat io.apiman.gateway.engine.policies.auth.JDBCIdentityValidator.validate( JDBCIdentityValidator.java:90)\n\tat io.apiman.gateway.engine.policies.BasicAuthenticationPolicy.validateCredentials(BasicAuthenticationPolicy.java:169)\n\tat io.apiman.gateway.engine.policies.BasicAuthenticationPolicy.doApply(BasicAuthenticationPolicy. java:126)\n\tat io.apiman.gateway.engine.policies.BasicAuthenticationPolicy.doApply(BasicAuthenticationPolicy.java:45)\n\tat io.apiman.gateway.engine.policies.AbstractMappedPolicy.apply(AbstractMappedPolicy.java: 70)\n\tat io.apiman.gateway.engine.policy.RequestChain.applyPolicy(RequestChain.java:68)\n\tat io.apiman.gateway.engine.policy.Chain.doApply(Chain.java:148) \n\tat io.apiman.gateway.engine.policies。RateLimitingPolicy$1.handle(RateLimitingPolicy.java:104)\n\tat io.apiman.gateway.engine.policies.RateLimitingPolicy$1.handle(RateLimitingPolicy.java:91)\n\tat io.apiman.gateway.engine.es。 ESRateLimiterComponent.updateBucketAndReturn(ESRateLimiterComponent.java:117)\n\tat io.apiman.gateway.engine.es.ESRateLimiterComponent.accept(ESRateLimiterComponent.java:83)\n\tat io.apiman.gateway.engine.policies.RateLimitingPolicy。 doApply(RateLimitingPolicy.java:91)\n\tat io.apiman.gateway.engine.policies.RateLimitingPolicy.doApply(RateLimitingPolicy.java:45)\n\tat io.apiman.gateway.engine.policies.AbstractMappedPolicy.apply( AbstractMappedPolicy.java:70)\n\tat io.apiman.gateway.engine.policy.RequestChain.applyPolicy(RequestChain.java:68)\n\tat io.apiman.gateway.engine.policy.Chain.doApply(Chain. java:148)\n\tat io.apiman.gateway.engine.impl.ApiRequestExecutorImpl。lambda$execute$4(ApiRequestExecutorImpl.java:276)\n\tat io.apiman.gateway.engine.impl.ApiRequestExecutorImpl.lambda$loadPolicies$7(ApiRequestExecutorImpl.java:666)\n\tat io.apiman.gateway.engine。 policy.PolicyFactoryImpl.loadPolicy(PolicyFactoryImpl.java:95)\n\tat io.apiman.gateway.engine.impl.ApiRequestExecutorImpl.loadPolicies(ApiRequestExecutorImpl.java:634)\n\tat io.apiman.gateway.engine.impl。 ApiRequestExecutorImpl.lambda$execute$6(ApiRequestExecutorImpl.java:397)\n\tat io.apiman.gateway.engine.impl.SecureRegistryWrapper$2.handle(SecureRegistryWrapper.java:189)\n\tat io.apiman.gateway.engine。 impl.SecureRegistryWrapper$2.handle(SecureRegistryWrapper.java:171)\n\tat io.apiman.gateway.engine.es.CachingESRegistry.getContract(CachingESRegistry.java:103)\n\tat io.apiman.gateway.engine.impl .SecureRegistryWrapper.getContract(SecureRegistryWrapper.java:171)\n\tat io.apiman.gateway.engine.impl.ApiRequestExecutorImpl.execute(ApiRequestExecutorImpl.java:363)\n\tat io.apiman.gateway.platforms.servlet.GatewayServlet.doAction(GatewayServlet.java:178) \n\tat io.apiman.gateway.platforms.servlet.GatewayServlet.service(GatewayServlet.java:79)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat io. undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\n\tat io.undertow.servlet。 handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\n\tat org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)\n\tat io.undertow.server.handlers.PredicateHandler。handleRequest(PredicateHandler.java:43)\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest( ServletAuthenticationCallHandler.java:57)\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) \n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\n\tat io.undertow.servlet.handlers.security。CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\n\tat io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler. java:43)\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java: 61)\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)\n \tat io.undertow.server.handlers.PredicateHandler。handleRequest(PredicateHandler.java:43)\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java :81)\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\ n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\n\tat org .wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)\n\tat org.wildfly.extension.undertow.deployment。UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)\n\tat org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)\n\tat org. wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)\n\tat org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java: 1508)\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)\n\ tat io.undertow.servlet.handlers.ServletInitialHandler$1。handleRequest(ServletInitialHandler.java:104)\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:326)\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:812)\ n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\tat java.lang.Thread .run(Thread.java:748)\n原因:java.sql.SQLException: 没有合适的驱动程序\n\tat java.sql.DriverManager.getDriver(DriverManager.java:315)\n\tat com.zaxxer.hikari。 util.DriverDataSource.(DriverDataSource.java:81)\n\t... 74 更多\n"}ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\tat java.lang.Thread.run(Thread.java:748) \n原因:java.sql.SQLException: 没有合适的驱动程序\n\tat java.sql.DriverManager.getDriver(DriverManager.java:315)\n\tat com.zaxxer.hikari.util.DriverDataSource.(DriverDataSource.java: 81)\n\t... 74 更多\n"}ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\tat java.lang.Thread.run(Thread.java:748) \n原因:java.sql.SQLException: 没有合适的驱动程序\n\tat java.sql.DriverManager.getDriver(DriverManager.java:315)\n\tat com.zaxxer.hikari.util.DriverDataSource.(DriverDataSource.java: 81)\n\t... 74 更多\n"}

0 投票
1 回答
255 浏览

wildfly - WildFly-10 - APIMAN 发布问题

我有 wildfly 10 并安装了 APIMAN 1.5.1.APIMAN。组织/API 创建完成,在发布 API 时,出现以下错误

io.apiman.manager.api.rest.contract.exceptions.ActionException:无法发布 API。

在此处输入图像描述

0 投票
1 回答
69 浏览

preflight - 授权策略正在破坏 APIMAN 中的预检检查

我的 API 有 2 个策略(cors +1),第一个是 keycloakOauthPolicy,第二个是 AuthorizationPolicy。

当我发出一些预检请求(然后使用动词 OPTIONS 并且标头中没有任何标记)时,我从 AuthorizationPolicy 收到该错误:

身份验证期间未提取任何角色。确保 >authorization 策略出现>your configuration 中的兼容身份验证策略之后

我究竟做错了什么?