Я понимаю, что для доступа к компании, которая в настоящее время не открыта в QuickBooks, веб-служба должна предоставить QuickBooks Web Connector расположение файла в качестве возвращаемого значения для вызова authenticate()
.
Мне это кажется обратным. Почему веб-служба должна сообщать веб-коннектору, где находится соответствующий файл компании? Не было бы более разумно, если бы им управлял веб-коннектор?
Вот соответствующее объяснение, которое я нашел в Руководстве программиста QuickBooks Web Connector:
- ЕСЛИ ваш веб-сервис хочет попробовать другую компанию, укажите путь к компании в возвращаемой строке. (Вы можете указать пустую строку, если хотите использовать любой открытый файл компании.) Веб-коннектор попытается снова подключиться к QuickBooks, используя предоставленную строку.
Зачем веб-сервису искать другую компанию?
Зачем веб-службе выполнять второе из этих действий, а не просто полностью останавливаться? На практике этот подход используется, когда веб-служба запоминает путь к файлу компании от сеанса к сеансу (рекомендуемая практика) и хочет иметь запасной вариант для использования любого файла компании, открытого в данный момент в QuickBooks (путем ответа на вызов connectionError с помощью пустая строка).
Это не так случайно, как может показаться. Когда веб-служба добавляется в веб-соединитель, веб-соединитель сохраняет уникальный идентификатор файла в качестве расширения личных данных в указанной компании. В результате веб-служба всегда может убедиться, что она взаимодействует с ожидаемым файлом компании, просто проверив CompanyRet, возвращенный вашей веб-службе в первом вызове sendRequestXML веб-коннектора в последовательности обмена данными. (Проверьте список расширений данных для ожидаемого FileID.)
Это похоже на плохой опыт конечного пользователя; если они переместят файл своей компании (при условии, что они хотят, чтобы веб-коннектор работал без открытия QuickBooks), веб-служба не будет работать до тех пор, пока этот путь не будет обновлен на стороне сервера. Кажется вполне правдоподобным, что конечный пользователь мог сделать это, не зная, что это сломает что-то.
Почему это так устроено? И что еще более важно: есть ли способ обойти это?