2013-12-19 2 views
2

У меня эта головная боль сейчас, так как у меня была эта проблема целый день и, тем не менее, ее не исправить. Я смотрел на Google и StackOverflow в течение нескольких часов, пробовал много методов (включая переход с JSON на JSONP, проверку заголовков на PHP, тесты localhost), спросил друзей и т. Д., И я все еще застрял. Может быть, это всего лишь деталь, я не знаю.JQuery JSON призывает к PHP WebService всегда запускает обратный вызов «Ошибка»

Я работаю над мобильным приложением Android, и для этого у меня есть веб-сервис PHP на хостинге (скажем, example.com), который работает нормально, так как я тестировал его с помощью клиента PHP WS JSON. Проблема в том, я звоню этот WS Теперь из файла JS на моем компьютере с помощью JQuery, JSON и Ajax, и я получаю следующий ответ от отладчика консоли Google Chrome:

  • readyState: 4
  • его статуса: " OK»
  • responseText: (что мне нужно, никаких ошибок)

Но ответа от сервера, я всегда получить обратный вызов ошибки, никогда успеха. Я читал это потому, что сервер не смог правильно разобрать JSON, но я действительно не знаю.

Я оставляю вам свой код.

От CLIENT.JS:

$.ajax({ 
    type: "POST", 
    crossDomain: true, 
    contentType: "application/json utf-8", 
    dataType: "json", 
    url: "http://www.example.com/ws/webservice.php/" + methodName, 
    data: JSON.stringify(window.parameterArray), 

    success: function (response) 
     { 
      alert('Success!'); 
      window.resultVar = "Success! " + response; 
      console.log(response); 
     }, 
    error: function (response) 
     { 
      alert('Error'); 
      window.resultVar = "Error: " + response; 
      console.log(response); 
     } 
}); 

От SERVER.PHP:

<?php 
header('Access-Control-Allow-Origin: *'); //I have also tried the * wildcard and get the same response 
header("Access-Control-Allow-Credentials: true"); 
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); 
header('Access-Control-Max-Age: 1000'); 
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description'); 
header('Content-type: application/json; charset=utf-8'); 

require_once "mobilefuncts.php"; 

$methodName = str_replace($_SERVER["SCRIPT_NAME"]."/", "", $_SERVER["REQUEST_URI"]); 

if (isset($methodName)) 
{ 
    $param = (array)json_decode($HTTP_RAW_POST_DATA); 

    $access = new MobileAccess(); //From mobilefuncts.php 
    $result = call_user_func_array(array($access,$methodName), $param); //Calls the method 

    echo json_encode($result); 
} 
?> 

ли знает, что можно сделать любой? Возможно, как я уже говорил, проблема - это всего лишь деталь. Я не знаю, действительно, я новичок в таких вещах.

Спасибо в forehand!

UPDATE:

Я просто понял, консоль Chrome говорит мне так:

GET http://localhost:81/.../cordova_plugins.json 404 (Not Found) 

Может быть причиной этой проблемы?

UPDATE 2:

Посмотрите здесь, у меня есть ключ. Я добавил несколько параметров в функцию ошибки, и получил себе этот результат:

(Изменение ошибки из функции (отклик) для функции (jqXHR, textStatus, errorThrown))

jqXHR.responseText: [an array with the info I'm asking] 
errorThrown: "SyntaxError: Unexpected token" 
+1

'contentType:" application/json utf-8 "Отсутствует точка с запятой? –

+0

Что такое ответ? – FazoM

+0

«ответ» говорит, между прочим, что я ставлю на главный пост: readyState: 4 статус: 200 его статуса: «OK» responseText: (что мне нужно, без ошибок) –

ответ

0

потому что вы делаете перекрестные вызовы домена, вам нужно использовать JSONP. PHP-сервер должен сформировать ответ, который выглядит так: callback (jsonSyntax);

+0

Спасибо, T McKeown! На самом деле это было решением проблемы. Я дам вам правильный голос, как только я получу 15 очков репутации, хе-хе. Еще раз спасибо, и я надеюсь, что узнал урок. –

0

Изменение

contentType: "application/json utf-8", 

в

contentType: "application/json; charset=utf-8", 

Недостаток вашего заголовка contentType заставляет ваш сервер неправильно интерпретировать содержимое вашего запроса POST.

+0

извини, Brad M, но это решение не работает. Фактически, я изменил эту инструкцию, пытаясь исправить эту проблему, потому что у меня было это так несколько дней назад. Спасибо, в любом случае! Вы надели меня на мгновение :) –

0

Попробуйте изменить URL JQuery из:

http://www.example.com/ws/webservice.php/methodName 

To:

http://www.example.com/ws/webservice.php?method=methodName 

А затем попытаться прочитать его из $ _GET [ 'метод'] из PHP, я думаю, что это должно быть ваша проблема

+0

Нет, тот же результат. Дело в том, что WS правильно обретает метод, но обратный вызов вызывает проблемы. ОтветText работает, поскольку он получает то, что я хочу, но он приходит на обратный вызов «ошибка» вместо «успеха». Спасибо в любом случае, Elhussein Hashem. –

0

Просто измените свой ответ на текст, а затем разобрать текст как JSON, например:

var json = JSON.parse (данные);

+0

Я не понимаю этого подхода. Единственное, о чем я могу думать, это использовать JSON.parse (который, действительно, я должен использовать где-нибудь) в ответе, но проблема в том, что разбор должен быть вызван внутри успеха или обратного вызова ошибки, не так ли? Таким образом, это не сработает, потому что все, что я делаю, не будет успешным. Я получаю это правильно? –

+0

Я не следую за ... делаю это в шагах ребенка ... если вы не можете заставить ваш СЕРВЕР возвратить JSON, тогда я просто перейду и получу результаты в виде текста, а затем проанализирую JSON, ошибка - это ошибка будет текст ... У меня была аналогичная проблема, когда мой обработчик ashx не возвращался как JSON, поэтому я получил его как строку и проанализировал ее. –

+0

Получение ошибки 404 означает, что какой-то ресурс не найден .... это то, что cordova.json что-то вы загружаете ??? –

Смежные вопросы