2016-02-27 15 views
22

Content-Type nasıl ayarlanır ve acgular2 içinde kabul edilir?Content-Type (Alma Türü) ve angular2 hatası nasıl kabul edilir 415 Desteklenmeyen Ortam Türü

Ben, her zaman göndermek başlığında yılında Ama göndermez somereason için içerik türü (application/json) post çağrıyı göndermeye çalışıyorum metin/düz; içerik türü charset = UTF-8 Bir REST servis çağrısı yapmaya çalıştığımda 415 Desteklenmeyen Ortam Türü alıyorum. Ben düzgün bir şekilde bu i bize Aşağıda başlık isteği

Accept 
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding 
gzip, deflate 
Accept-Language 
en-US,en;q=0.5 
Content-Length 
13 
Content-Type  
text/plain; charset=UTF-8 
Host  
enrova.debug-zone.com:8000 
Origin 
http://localhost:8000 
Referer 
http://localhost:8000/add 
User-Agent 
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0 

Kod altındadır fo Ne kodundan ayarlanır gelmez tipini ve İçerik-türünü ayarlamak gerek

import {Component, View} from 'angular2/angular2'; 
    import { Inject} from 'angular2/di'; 
    import {Http} from 'angular2/http'; 

    export class AchievementsService { 
     constructor(@Inject(Http) private http: Http) {   
     } 

     getAchievementsOfType(type: string) : any { 
      var path = '/api/achievements/' + type; 
      return this.http.get(path); 
     } 

     getAllAchievements() : any { 
      var path = '/api/achievements'; 
      return this.http.get(path); 
     } 

     addAnAchievement(newAchievement) { 

      //var path = '/api/achievements'; 
      var path = 'http://test.com:8000/branch'; 
      return this.http.post('http://test.com:8000/branch', JSON.stringify(newAchievement),{ 
      headers: { 'Content-Type': 'application/json; charset=utf-8'} }); 

    } 

**Calling Class** 


import {Component, View} from 'angular2/angular2'; 
    import { _settings } from '../../settings' 
    import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms'; 
    import {Inject} from 'angular2/di'; 
    import {Router} from 'angular2/router'; 
    import {AchievementsService} from '../../services/achievementsService'; 

    @Component({ 
     selector: 'add', 
     injectables: [FormBuilder] 
    }) 
    @View({ 
     templateUrl: _settings.buildPath + '/components/add/add.html', 
     directives: [formDirectives] 
    }) 
    export class Add { 
     addAchievementForm: any; 

     constructor(@Inject(FormBuilder) private formBuilder: FormBuilder, 
     @Inject(Router) private router: Router, 
     @Inject(AchievementsService) private achievementsService: AchievementsService) { 

     this.addAchievementForm = formBuilder.group({ 
      name: [''] 

     }); 
     } 
    // This is the funtion that call post call written in achievementsService.ts 
     addAchievement() { 
     this.achievementsService.addAnAchievement(this.addAchievementForm.value) 
      .map(r => r.json()) 
      .subscribe(result => { 
      this.router.parent.navigate('/'); 
      }); 


     } 
    } 

cevap

50

Angular2 belgelerinde (https://angular.io/docs/ts/latest/guide/server-communication.html) yazılmış daha temiz bir yol.

import {Headers, RequestOptions} from 'angular2/http'; 

let body = JSON.stringify({ 'foo': 'bar' }); 
let headers = new Headers({ 'Content-Type': 'application/json' }); 
let options = new RequestOptions({ headers: headers }); 

return this.http.post(url, body, options) 
       .map(res => res.json().data) 
       .catch(this.handleError) 

Bunun yalnızca POST sorguları için gerekli olduğuna inanıyorum.

+0

Bunun yerine cevabımı kullanabilirim, neden tek bir alana, yani 'RequestOptions' –

+0

'a bağlayarak gönderebildiğimiz zaman bireysel değerleri göndermek için teşekkürler wli, Ama 'res.json(). Data' veya' res.json() 'bu, API'den bir veriyi geri göndermeye bağlıdır. Birisine yardımcı olabilir. –

6

Öncelikle angular2/angular2 dan yanlış ithalat kullanıyorsunuz şimdi angular2 beta sürümünde olduğundan, hemen hemen tüm ithalatlar değişti. Tüm ithalat listesi için bu cevabı okuyun.

https://stackoverflow.com/a/34440018/5043867

sonra benim anlayış kadar ne düşünüyorum DİNLENME Api'si ile Gönder isteği çağırmak istiyorum ve ben başlığının kullanılmasını örneğini göndermek Header bunu ekleyerek aynı göndermek için content type='application/json' böylece gelmiş göndermek istediğiniz Aşağıdaki gibi içerik türü kullanmak.

import {Component, View, Inject} from 'angular2/core'; 
import {Http} from 'angular2/http'; 

PostRequest(url,data) { 
     this.headers = new Headers(); 
     this.headers.append("Content-Type", 'application/json'); 
     this.headers.append("Authorization", 'Bearer ' + localStorage.getItem('id_token')) 

     this.requestoptions = new RequestOptions({ 
      method: RequestMethod.Post, 
      url: url, 
      headers: this.headers, 
      body: JSON.stringify(data) 
     }) 

     return this.http.request(new Request(this.requestoptions)) 
      .map((res: Response) => { 
       if (res) { 
        return [{ status: res.status, json: res.json() }] 
       } 
      }); 
} 

I yöntem adı PostRequest kullanılarak yapay bir örnek tahmin ediyorum. HTTP ve REST API çağrısı hakkında daha fazla bilgi için buraya bakın: https://stackoverflow.com/a/34758630/5043867

İlgili konular