2010-11-19 2 views
4

jsonp 요청의 서버 쪽과 클라이언트 쪽 모두를 만들려고하는데 작동하지 않는 것 같습니다. 수많은 가이드, 블로그 게시물 등을 둘러 보았지만 거의 모든 사람들이 클라이언트 측만 보여줍니다.JSONP - 액세스 제어 허용 - 원본 및 MIME 형식 오류

여기에 서버가이

jsonpCallback({"username":"meltingice","posts"1234}); 

내 문제처럼 하드 코드 값을 반환 지금

$.ajax({ 
    dataType: 'application/json', 
    data: params, 
    jsonp: 'jsonpCallback', 
    url: settings.domain + '/httpext.dll?json_cc', 
    success: function (data) { 
     //determine the return status 
    }, 
    error: function (response, status, error) { 
     //error handling 
    } 
}); //end ajax 

내 클라이언트 코드

의 내가 함께 작업 요청 및 응답을 얻을 수 있다는 것입니다. 현재 응답이 application/json을 반환하고 있으므로 요청을 변경하면 jsonp에 오류가 발생합니다

리소스는 스크립트로 해석되지만 MIME 유형 application/json으로 전송됩니다. 잡히지 않은 ReferenceError : jsonpCallback이 정의되지 않았습니다.

먼저 알 수 있듯이 jsonpCallback이 정의되어 있습니다. 나는 응용 프로그램/JSON으로 데이터 유형을 변경하는 경우

지금, 나는 당신이, 그것은 URL에 callback=?을 가하고되지 볼 수 있듯이이 오류

XMLHttpRequest cannot load http://myserver/httpext.dll?json_cc&sid=adsfhasjdkfhajksdghjk%3Basdhg&action=SALE&ccCard=&ccNum=&ccExMM=0&ccExYYYY=0&ccCVV2=&holdersName=&totalDue=0&dueDate=11%2F19%2F2010. Origin http://localhost:59905 is not allowed by Access-Control-Allow-Origin. 

를 얻을. 다소 실망 스럽습니다.

jsonp를 사용하여 서버 측을 설정하려면 어떻게해야합니까? 응답 유형에는 무엇이 필요합니까? 내 클라이언트 측 코드가 데이터를 되돌릴 수 있도록 반환 된 데이터의 형식을 지정하려면 어떻게해야합니까?

답변

5

서버가 항상 하드 코딩 된 메서드 이름을 반환하고 클라이언트가 익명의 success 처리기를 사용하고 있기 때문에이 방법이 작동하지 않는 이유가 있습니다. 이것은 작동하지 않습니다. 인수로 전달 된 메서드 이름을 사용하도록 서버를 구성해야합니다. 그렇지 않으면 클라이언트에서 success 콜백을 호출하지 않습니다. 당신이 고려하도록 서버를 구성 그래서 일단 jsoncallback 쿼리 매개 변수는 다음과 같이 테스트 할 수 :

http://foo.com/httpext.dll?json_cc&jsoncallback=jsonp1290183992345 

하고 :

$.getJSON(settings.domain + '/httpext.dll?json_cc&jsoncallback=?', params, function(result) { 
    alert('success'); 
}); 

지금 서버가 다음과 같을 수 요청을 받게됩니다 이 같은 응답해야합니다

jsonp1290183992345({"username":"meltingice","posts"1234}); 

을 분명히 적절한 Content-Type뿐만 아니라 (application/json)와 함께.

+0

기본 콜백 이름을 가져 오기 위해 코드를 변경했지만 다른 오류가 계속 발생합니다. 스크립트로 해석되었지만 MIME 유형 application/json으로 전송 된 리소스입니다. – Josh

1

또한 jsoncallback을 처리하기 위해 ASP.NET MVC에서 사용한이 스 니펫을 제공하고 싶습니다.

private static ActionResult GetContent(object data, string callback) 
    { 
     if (!string.IsNullOrEmpty(callback)) 
     { 
      ContentResult result = new ContentResult(); 
      result.ContentType = "application/json"; 

      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string json = serializer.Serialize(data); 
      result.Content = string.Format("{0}({1})", callback, json); 
      return result; 
     } 
     else 
     { 
      JsonResult result = new JsonResult(); 
      result.Data = data; 
      result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
      return result; 
     } 
    }