PageSourceSearch

https://java2ai.com/assets/js/8708f931.915a626f.js

js java2ai.com collected 2026-10-03 21:34:32 UTC 13,919 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkspring_ai_alibaba_website=self.webpackChunkspring_ai_alibaba_website||[]).push([[3351],{28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>d});var a=t(96540);const s={},i=a.createContext(s);function r(e){const n=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(i.Provider,{value:n},e.children)}},31458:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>c,frontMatter:()=>r,metadata:()=>a,toc:()=>p});const a=JSON.parse('{"id":"assistantagent/features/dynamic-http/advanced","title":"\u52a8\u6001 HTTP \u5de5\u5177 - \u9ad8\u7ea7\u7279\u6027","description":"1. \u591a OpenAPI \u6587\u6863\u652f\u6301","source":"@site/agents-docs/assistantagent/features/dynamic-http/advanced.md","sourceDirName":"assistantagent/features/dynamic-http","slug":"/assistantagent/features/dynamic-http/advanced","permalink":"/agents/assistantagent/features/dynamic-http/advanced","draft":false,"unlisted":false,"editUrl":"https://github.com/spring-ai-alibaba/website/tree/main/agents-docs/assistantagent/features/dynamic-http/advanced.md","tags":[],"version":"current","lastUpdatedBy":"canfuu","lastUpdatedAt":1767918666000,"frontMatter":{},"sidebar":"agentsSidebar","previous":{"title":"\u5feb\u901f\u5f00\u59cb","permalink":"/agents/assistantagent/features/dynamic-http/quickstart"},"next":{"title":"\u5feb\u901f\u5f00\u59cb","permalink":"/agents/assistantagent/features/custom-codeact-tool/quickstart"}}');var s=t(74848),i=t(28453);const r={},d="\u52a8\u6001 HTTP \u5de5\u5177 - \u9ad8\u7ea7\u7279\u6027",l={},p=[{value:"1. \u591a OpenAPI \u6587\u6863\u652f\u6301",id:"1-\u591a-openapi-\u6587\u6863\u652f\u6301",level:2},{value:"2. \u8ba4\u8bc1\u914d\u7f6e",id:"2-\u8ba4\u8bc1\u914d\u7f6e",level:2},{value:"Bearer Token",id:"bearer-token",level:3},{value:"API Key",id:"api-key",level:3}
1,{value:"\u52a8\u6001\u8ba4\u8bc1",id:"\u52a8\u6001\u8ba4\u8bc1",level:3},{value:"3. \u53c2\u6570\u6620\u5c04",id:"3-\u53c2\u6570\u6620\u5c04",level:2},{value:"Path \u53c2\u6570",id:"path-\u53c2\u6570",level:3},{value:"Query \u53c2\u6570",id:"query-\u53c2\u6570",level:3},{value:"Request Body",id:"request-body",level:3},{value:"4. \u54cd\u5e94\u5904\u7406",id:"4-\u54cd\u5e94\u5904\u7406",level:2},{value:"JSON \u54cd\u5e94",id:"json-\u54cd\u5e94",level:3},{value:"\u539f\u59cb\u54cd\u5e94",id:"\u539f\u59cb\u54cd\u5e94",level:3},{value:"5. \u8d85\u65f6\u4e0e\u91cd\u8bd5",id:"5-\u8d85\u65f6\u4e0e\u91cd\u8bd5",level:2},{value:"6. \u8bf7\u6c42/\u54cd\u5e94\u62e6\u622a",id:"6-\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a",level:2},{value:"7. \u81ea\u5b9a\u4e49\u7c7b\u540d\u548c\u63cf\u8ff0",id:"7-\u81ea\u5b9a\u4e49\u7c7b\u540d\u548c\u63cf\u8ff0",level:2},{value:"8. \u6279\u91cf\u66b4\u9732 Endpoints",id:"8-\u6279\u91cf\u66b4\u9732-endpoints",level:2},{value:"9. OpenAPI \u6587\u6863\u6765\u6e90",id:"9-openapi-\u6587\u6863\u6765\u6e90",level:2},{value:"\u4ece\u6587\u4ef6\u52a0\u8f7d",id:"\u4ece\u6587\u4ef6\u52a0\u8f7d",level:3},{value:"\u4ece URL \u52a0\u8f7d",id:"\u4ece-url-\u52a0\u8f7d",level:3},{value:"\u4ece classpath \u52a0\u8f7d",id:"\u4ece-classpath-\u52a0\u8f7d",level:3},{value:"10. \u8c03\u8bd5\u4e0e\u65e5\u5fd7",id:"10-\u8c03\u8bd5\u4e0e\u65e5\u5fd7",level:2}];function o(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"\u52a8\u
16001-http-\u5de5\u5177---\u9ad8\u7ea7\u7279\u6027",children:"\u52a8\u6001 HTTP \u5de5\u5177 - \u9ad8\u7ea7\u7279\u6027"})}),"\n",(0,s.jsx)(n.h2,{id:"1-\u591a-openapi-\u6587\u6863\u652f\u6301",children:"1. \u591a OpenAPI \u6587\u6863\u652f\u6301"}),"\n",(0,s.jsx)(n.p,{children:"\u914d\u7f6e\u591a\u4e2a API \u670d\u52a1\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@Bean\npublic List<HttpDynamicToolFactory> httpToolFactories() {\n    return List.of(\n        // Pet Store API\n        HttpDynamicToolFactory.builder()\n            .openApiSpec(loadOpenApiSpec("openapi/petstore.json"))\n            .addEndpoint(EndpointSpec.get("/pets"))\n            .addEndpoint(EndpointSpec.post("/pets"))\n            .build(),\n        \n        // Order API\n        HttpDynamicToolFactory.builder()\n            .openApiSpec(loadOpenApiSpec("openapi/orders.json"))\n            .addEndpoint(EndpointSpec.get("/orders"))\n            .addEndpoint(EndpointSpec.post("/orders"))\n            .build()\n    );\n}\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"2-\u8ba4\u8bc1\u914d\u7f6e",children:"2. \u8ba4\u8bc1\u914d\u7f6e"}),"\n",(0,s.jsx)(n.h3,{id:"bearer-token",children:"Bearer Token"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'HttpDynamicToolFactory.builder()\n    .openApiSpec(OpenApiSpec.builder(openApiContent)\n        .baseUrl("https://api.example.com")\n        .build())\n    .defaultHeaders(Map.of(\n        "Authorization", "Bearer " + apiToken\n    ))\n    .addEndpoint(EndpointSpec.get("/protected/data"))\n    .build();\n'})}),"\n",(0,s.jsx)(n.h3,{id:"api-key",children:"API Key"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'HttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .defaultHeaders(Map.of(\n        "X-API-Key", apiKey\n    ))\n    .addEndpoint(EndpointSpec.get("/data"))\n    .build();\n'})}
1),"\n",(0,s.jsx)(n.h3,{id:"\u52a8\u6001\u8ba4\u8bc1",children:"\u52a8\u6001\u8ba4\u8bc1"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'HttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .headerProvider(() -> Map.of(\n        "Authorization", "Bearer " + tokenService.getToken()\n    ))\n    .addEndpoint(EndpointSpec.get("/data"))\n    .build();\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"3-\u53c2\u6570\u6620\u5c04",children:"3. \u53c2\u6570\u6620\u5c04"}),"\n",(0,s.jsx)(n.h3,{id:"path-\u53c2\u6570",children:"Path \u53c2\u6570"}),"\n",(0,s.jsx)(n.p,{children:"OpenAPI \u4e2d\u7684 path \u53c2\u6570\u81ea\u52a8\u6620\u5c04\u4e3a\u5de5\u5177\u53c2\u6570\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n  "paths": {\n    "/pets/{petId}": {\n      "get": {\n        "operationId": "getPet",\n        "parameters": [\n          {\n            "name": "petId",\n            "in": "path",\n            "required": true,\n            "schema": { "type": "string" }\n          }\n        ]\n      }\n    }\n  }\n}\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'# Agent \u751f\u6210\u7684\u8c03\u7528\u4ee3\u7801\npet = http_pets.get_pet(petId="123")\n'})}),"\n",(0,s.jsx)(n.h3,{id:"query-\u53c2\u6570",children:"Query \u53c2\u6570"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n  "parameters": [\n    {\n      "name": "status",\n      "in": "query",\n      "schema": { \n        "type": "string",\n        "enum": ["available", "pending", "sold"]\n      }\n    }\n  ]\n}\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'# Agent \u751f\u6210\u7684\u8c03\u7528\u4ee3\u7801\npets = http_pets.list_pets(status="available")\n'})}),"\n",(0,s.jsx)(n.h3,{id:"request-body",children:"Request Body"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n  "requestBody": {\n    "required": true,\n    "content": {\n      "application/json": {\n        "schema": {\n          "type": "object",\n          "properties": {\n            "name": { "type": "string" },\n            "age": { "type": "integer" }\n          },\n          "required": ["name"]\n        }\n      }\n    }\n  }\n}\n'})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'# Agent \u751f\u6210\u7684\u8c03\u7528\u4ee3\u7801\nresult = http_pets.create_pet(name="\u5c0f\u82b1", age=2)\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"4-\u54cd\u5e94\u5904\u7406",children:"4. \u54cd\u5e94\u5904\u7406"}),"\n",(0,s.jsx)(n.h3,{id:"json-\u54cd\u5e94",children:"JSON \u54cd\u5e94"}),"\n",(0,s.jsx)(n.p,{children:"\u9ed8\u8ba4\u89e3\u6790 JSON \u54cd\u5e94\u4e3a Python \u5b57\u5178/\u5217\u8868\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'result = http_api.get_data()\n# result \u662f\u89e3\u6790\u540e\u7684 JSON \u5bf9\u8c61\nprint(result["name"])\n'})}),"\n",(0,s.jsx)(n.h3,{id:"\u539f\u59cb\u54cd\u5e94",children:"\u539f\u59cb\u54cd\u5e94"}),"\n",(0,s.jsx)(n.p,{children:"\u83b7\u53d6\u539f\u59cb HTTP \u54cd\u5e94\u4fe1\u606f\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"result = http_api.get_data_raw()\n# result \u5305\u542b status_code, headers, body\nprint(f\"\u72b6\u6001\u7801: {result['status_code']}\")\nprint(f\"\u54cd\u5e94\u4f53: {result['body']}\")\n"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"5-\u8d85\u65f6\u4e0e\u91cd\u8bd5",children:"5. \u8d85\u65f6\u4e0e\u91cd\u8bd5"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'HttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .connectionTimeout(Duration.ofSeconds(10))\n    .readTimeout(Duration.ofSeconds(30))\n    .retryConfig(RetryConfig.builder()\n        .maxRetries(3)\n        .retryOn(IOException.class)\n        .backoff(Duration.ofMillis(500))\n        .build())\n    .addEndpoint(EndpointSpec.get("/slow-api"))\n    .build();\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"6-\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a",children:"6. \u8bf7\u6c42/\u54cd\u5e94\u62e6\u622a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'HttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .requestInterceptor(request -> {\n        // \u6dfb\u52a0\u8bf7\u6c42 ID\n        request.header("X-Request-ID", UUID.randomUUID().toString());\n        return request;\n    })\n    .responseInterceptor(response -> {\n        // \u8bb0\u5f55\u54cd\u5e94\u65f6\u95f4\n        logger.info("\u54cd\u5e94\u72b6\u6001: {}", response.getStatusCode());\n        return response;\n    })\n    .addEndpoint(EndpointSpec.get("/data"))\n    .build();\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"7-\u81ea\u5b9a\u4e49\u7c7b\u540d\u548c\u63cf\u8ff0",children:"7. \u81ea\u5b9a\u4e49\u7c7b\u540d\u548c\u63cf\u8ff0"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'HttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .targetClassName("inventory")              // \u8986\u76d6 tags \u63a8\u65ad\u7684\u7c7b\u540d\n    .targetClassDescription("\u5e93\u5b58\u7ba1\u7406\u7cfb\u7edf API")\n    .addEndpoint(EndpointSpec.get("/stock"))\n    .build();\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"8-\u6279\u91cf\u66b4\u9732-endpoints",children:"8. \u6279\u91cf\u66b4\u9732 Endpoints"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'// \u66b4\u9732\u6240\u6709 GET endpoints\nHttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .addAllEndpointsMatching(operation -> \n        "get".equalsIgnoreCase(operation.getMethod()))\n    .build();\n\n// \u66b4\u9732\u7279\u5b9a tag \u4e0b\u7684\u6240\u6709 endpoints\nHttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .addAllEndpointsWithTag("pets")\n    .build();\n\n// \u66b4\u9732\u6240\u6709 endpoints\nHttpDynamicToolFactory.builder()\n    .openApiSpec(spec)\n    .addAllEndpoints()\n    .build();\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"9-openapi-\u6587\u6863\u6765\u6e90",children:"9. OpenAPI \u
16587\u6863\u6765\u6e90"}),"\n",(0,s.jsx)(n.h3,{id:"\u4ece\u6587\u4ef6\u52a0\u8f7d",children:"\u4ece\u6587\u4ef6\u52a0\u8f7d"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'OpenApiSpec.fromFile("openapi/api.json")\nOpenApiSpec.fromFile("openapi/api.yaml")\n'})}),"\n",(0,s.jsx)(n.h3,{id:"\u4ece-url-\u52a0\u8f7d",children:"\u4ece URL \u52a0\u8f7d"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'OpenApiSpec.fromUrl("https://api.example.com/openapi.json")\n'})}),"\n",(0,s.jsx)(n.h3,{id:"\u4ece-classpath-\u52a0\u8f7d",children:"\u4ece classpath \u52a0\u8f7d"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'OpenApiSpec.fromClasspath("openapi/api.json")\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"10-\u8c03\u8bd5\u4e0e\u65e5\u5fd7",children:"10. \u8c03\u8bd5\u4e0e\u65e5\u5fd7"}),"\n",(0,s.jsx)(n.p,{children:"\u542f\u7528\u8be6\u7ec6\u65e5\u5fd7\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"logging:\n  level:\n    com.alibaba.assistant.agent.extension.dynamic.http: DEBUG\n"})}),"\n",(0,s.jsx)(n.p,{children:"\u67e5\u770b\u751f\u6210\u7684\u5de5\u5177\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@Component\npublic class HttpToolDiagnostics {\n\n    private final CodeactToolRegistry registry;\n\n    @PostConstruct\n    public void printHttpTools() {\n        registry.getAllTools().stream()\n            .filter(t -> t.getMetadata().getFactoryId().equals("http"))\n            .forEach(tool -> {\n                System.out.println("HTTP Tool: " + tool.getName());\n                System.out.println("  Class: " + tool.getMetadata().getTargetClassName());\n                System.out.println("  Method: " + tool.getMetadata().getTargetMethodName());\n            });\n    }\n}\n'})})]})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.