Google 早期提供 SOAP 版 Web Search API (已停止服務),本文記錄一款純 C 實現的客戶端庫特性:內置 XML 解析器、GBK/UTF-8 雙向轉碼 (含 GBK 碼表)、HTTP 代理支持、標準 C 接口、申請 Key 機制。雖 API 已廢棄,但其**輕量級 SOAP 客戶端實現架構**仍具參考價值,適用於嵌入式/無依賴環境調用 SOAP 服務。
// 基礎類型映射
typedef char* xsd__string;
typedef int xsd__int;
typedef bool xsd__boolean;
typedef double xsd__double;
struct xsd__base64Binary { unsigned char* __ptr; int __size; };
// 陣列包裝器
struct ResultElementArray { typens__ResultElement* __ptr; int __size; int __offset; };
struct DirectoryCategoryArray { typens__DirectoryCategory* __ptr; int __size; int __offset; };
// 業務對象
struct typens__ResultElement {
xsd__string summary, URL, snippet, title, cachedSize;
xsd__boolean relatedInformationPresent;
xsd__string hostName;
typens__DirectoryCategory* directoryCategory;
xsd__string directoryTitle;
};
struct typens__GoogleSearchResult {
xsd__boolean documentFiltering;
xsd__string searchComments;
xsd__int estimatedTotalResultsCount;
xsd__boolean estimateIsExact;
ResultElementArray* resultElements;
xsd__string searchQuery;
xsd__int startIndex, endIndex;
xsd__string searchTips;
DirectoryCategoryArray* directoryCategories;
xsd__double searchTime;
};
| 函數 | 功能 | 關鍵參數 |
|---|---|---|
CreateSoapSession | 建立會話,返回句柄 | void** handle, char* serverAddr, char* key |
SetSoapProxy | 設置 HTTP 代理 | void* handle, char* proxyHost, int proxyPort |
doGoogleSearch | 執行搜索 | q, start, maxResults, filter, restrict, safeSearch, lr, ie, oe, outtypens__doGoogleSearchResponse* |
doGetCachedPage | 獲取緩存頁面 | url, out typens__doGetCachedPageResponse* |
doSpellingSuggestion | 拼寫建議 | phrase, out typens__doSpellingSuggestionResponse* |
GetSoapErrorMessage | 獲取最後錯誤信息 | 返回 char* |
FreeSoapCache | 釋放會話緩存 | void* handle |
FreeSoapSession | 銷毀會話 | void** handle |
void* session = NULL;
if (CreateSoapSession(&session, "https://api.google.com/search/beta2", "YOUR_API_KEY") != 0) return;
// 可選:設置代理
SetSoapProxy(session, "proxy.mycompany.com", 8080);
typens__doGoogleSearchResponse resp = {0};
int ret = doGoogleSearch(session,
"C++ SOAP client", // q
0, 10, // start, maxResults
true, "", // filter, restrict
true, "", // safeSearch, lr
"utf-8", "utf-8", // ie, oe
&resp);
if (ret == 0 && resp._return_) {
auto result = resp._return_;
printf("Total: %d, Time: %.3fs\n", result->estimatedTotalResultsCount, result->searchTime);
for (int i = 0; i < result->resultElements->__size; ++i) {
auto elem = &result->resultElements->__ptr[i];
printf("%s\n%s\n%s\n\n", elem->title, elem->URL, elem->snippet);
}
}
FreeSoapCache(session);
FreeSoapSession(&session);
...
...
...
本庫展示了**零依賴實現 SOAP 客戶端**的最小化架構:手寫 XML 序列化/反序列化、HTTP POST 組裝、字符集轉換、錯誤處理。理解此原理,有助於在無法引入重型框架的環境 (嵌入式、內核模式、舊版編譯器) 中快速對接 SOAP 服務。