XMLHttpRequest, чтобы получить ответ HTTP от отдаленного хозяина

Почему следующий кодекс На основе примера Mozilla не работает? Попробованный Firefox 3.5.7 & Хромом.







    

Пожалуйста то, что браузер вынимает HTML из местного диска (file:///C:/Users/Maxim%20Veksler/Desktop/XMLHTTP.html)

На Firefox это дает следующую ошибку:

uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.send]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: file:///C:/Users/Maxim%20Veksler/Desktop/XMLHTTP.html ::  :: line 10" data: no]

Что я делаю неправильно? Я хочу отправить запрос отдаленному хозяину и привести в готовность результат (позже к добавленному в отделение).

10
задан Maxim Veksler 13 January 2010 в 21:54
поделиться

4 ответа

Вы не хотите синхронизироваться на себе... Так как самообъекта ещё не существует! В конечном итоге блокируется временное значение идентификатора. Вы хотите убедиться, что больше никто не может запускать методы класса (sharedInstance, alloc, allocityWireZone: и т.д.), поэтому вам нужно синхронизироваться с объектом класса:

@implementation MYSingleton

static MYSingleton * sharedInstance = nil;

+( id )sharedInstance {
    @synchronized( [ MYSingleton class ] ) {
        if( sharedInstance == nil )
            sharedInstance = [ [ MYSingleton alloc ] init ];
    }

    return sharedInstance;
}

+( id )allocWithZone:( NSZone * )zone {
    @synchronized( [ MYSingleton class ] ) {
        if( sharedInstance == nil )
            sharedInstance = [ super allocWithZone:zone ];
    }

    return sharedInstance;
}

-( id )init {
    @synchronized( [ MYSingleton class ] ) {
        self = [ super init ];
        if( self != nil ) {
            // Insert initialization code here
        }

        return self;
    }
}

@end
-121--530770-

Вы не можете пересылать список переменных аргументов, так как нет пути выразить то, что находится под ... в качестве параметра (параметров) другой функции.

Однако можно создать список va _ из ... параметры и отправьте эти функции, которая правильно отформатирует их. Это то, для чего предназначен vprintf . Пример:

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   va_list args;
   va_start(args, fmt);
   vsprintf(buff, fmt, args);
   va_end(args);
   log(DEBUG, buff);
}
-121--1520251-

Ваш браузер предотвращает межсайтовые сценарии . Необходимо использовать относительный путь, иначе большинство браузеров просто вернут ошибку или пустой responseText.

Следующая запись переполнения стека, вероятно, также связана с вашей проблемой:

11
ответ дан 3 December 2019 в 23:13
поделиться

Запросы нельзя делать через домены, даже с локальными файлами.

https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

Если только вы не разрабатываете расширение, которое не имеет тех же ограничений, что и веб-страница.

0
ответ дан 3 December 2019 в 23:13
поделиться

Я также предполагаю, что вы открыли вашу тестовую страницу HTML В браузере, судя по вашу ссылку на файл: /// ... . Для вызовов XMLHTTPREQUEST , вам нужно служить HTML с сервера. Попробуйте что-то вроде xampp ( http://www.apachefresss.org/en/xampp.html ) Чтобы получить локальный сервер вверх и запустить, а затем запустить свой тест из http: // localhost / Xmlhttp.html .

Примечание, это не решает вашу проблему о том же происхождению, но это позволит работать следующий код:

  <script>
    var req = new XMLHttpRequest();
    req.open('GET', '/myTestResponse.html', false); 
    req.send();
    if(req.status == 200) {
        alert(req.responseText);
    }
  </script>
3
ответ дан 3 December 2019 в 23:13
поделиться

проблема безопасности нет

Предположительно светлячок мешает локальный файл от разговора с удаленным хостом

скаутинг вокруг сети -? нашла это. Попробуйте добавить это в начало вашего сценария:

try {
  netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
} catch (e) {
  alert("Permission UniversalBrowserRead denied.");
}

не может гарантировать, что это будет работать; Поскольку в конечном итоге то, что вы пытаетесь сделать, это ввести защитную дыру, которую браузеры были специально закодированы, чтобы подключить (перекрестные запросы).

Есть несколько специальных сценариев, где его можно включить, хотя, обычно по усмотрению пользователя.

0
ответ дан 3 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: