2

現在、Chrome 開発者ツール コンソールに表示されるエラーに苦しんでいます

GET http://localhost:8080/movie_db/search/movie?movieTitle=Machete 415 (Unsupported Media Type)

angular JSを使用してRESTサービスに接続しようとすると。以前、Chrome で Simple REST プラグインを介して REST サービスにアクセスしようとしたときにこの問題が発生したため、Content-Type ヘッダー パラメータが欠落している可能性が高いと考えられます (Content-Type: 'application/json である必要があります)。 ')。

Angular JS Web サイトによると、次のようにヘッダー パラメーターを設定できます$httpProvider.defaults.headers.get['My-Header']='value'。残念ながら、これは何の影響も与えず、問題はまだ存在しています。

したがって、REST サービスに送信される angular JS を使用してヘッダー パラメーターを操作する方法を知りたいと思います。

現時点では、私のコードは次のようになります。

  function SearchMovieController($scope, $resource) {

  $scope.SearchMovie = $resource('http://localhost\\:8080/movie_db/search/:action',
            {action: 'movie', movieTitle: 'Machete'},
            {get: {method: 'JSONP', headers: [{'Content-Type': 'application/json'}, {'Accept' : 'application/json'}]}});

        $scope.SearchMovie.get()
    }

サーバー側は次のようになります (私は Spring MVC を使用しています)。

コントローラ:

@Controller
@RequestMapping( "/search/movie" )
public class SearchController { // TODO rename?

private final TheMovieDBService theMovieDBService;

@Autowired
public SearchController( TheMovieDBService theMovieDBService ) {
    this.theMovieDBService = theMovieDBService;
}


@ResponseBody
@RequestMapping( method = RequestMethod.GET, produces = "application/json", consumes = "application/json" )
public Map<String, Object> search( @RequestParam String movieTitle ) {
    Map<String, Object> response = new HashMap<String, Object>();

    try {
        TheMovieDBSearchResult searchResult =  theMovieDBService.searchMovie( movieTitle );
        response.put( "result", searchResult );
        response.put( "success", "true" );
    } catch ( EncoderException e ) {
        response.put( "success", "false" );
    }
    return response;
}
}

web.xml

 <servlet>
    <servlet-name>json</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </init-param>

    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.u6f6o.apps.movie_db.config.web.ServletConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>json</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
4

1 に答える 1

2

つい最近、Angular の $httpBackend のすべてを処理する必要がありました。JSONP は、他の要求とは異なる方法でデータをロードします。

編集:問題のコード

したがって、jsonp にメソッドがあると指定すると、次のメソッドを使用してデータがロードされます。もちろん、これは自分で設定したヘッダーを完全に無視します。

$httpBackend で:

function jsonpReq(url, done) {
    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:
    // - fetches local scripts via XHR and evals them
    // - adds and immediately removes script elements from the document
    var script = rawDocument.createElement('script'),
        doneWrapper = function() {
          rawDocument.body.removeChild(script);
          if (done) done();
        };

    script.type = 'text/javascript';
    script.src = url;

    if (msie) {
      script.onreadystatechange = function() {
        if (/loaded|complete/.test(script.readyState)) doneWrapper();
      };
    } else {
      script.onload = script.onerror = doneWrapper;
    }

    rawDocument.body.appendChild(script);
  }
于 2013-02-24T18:01:13.750 に答える