2016-04-18 9 views
1

POSTリクエストを正常に送信する次の迅速なコードがあります。Swift 2 JSON POSTリクエスト[NSMutableURLRequestのHTTPBody用の辞書と文字列]

let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
let session = NSURLSession.sharedSession() 
request.HTTPMethod = "POST" 
request.HTTPBody = "foo=bar&baz=lee".dataUsingEncoding(NSUTF8StringEncoding) 

let task = session.dataTaskWithRequest(request, completionHandler: completionHandler) 

代わりに、構文のようなクエリパラメータを使用して、私は辞書を使用するようにしたいのですが、私はやるときは、次の(私の周り見てきたもののような)

let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
let session = NSURLSession.sharedSession() 
request.HTTPMethod = "POST" 
request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(["foo":"bar", "lee":"baz"], options: []) 

let task = session.dataTaskWithRequest(request, completionHandler: completionHandler) 

、それはそう身体が空であるかのようにリクエストを提出します。

私の主な質問は、これらの構文がどのように異なっているのか、結果のリクエストはどう違うのですか?

:JSから来て、私は以下のようにjavascriptの環境(jquery.comのコンソール)でエンドポイントをテストしていて、それが正常に働いている:

$.ajax({ 
    url: url, 
    method: 'POST', 
    data: { 
    foo: 'bar', 
    baz: 'lee' 
    } 
}); 
+4

をアプリケーション/ JSON対x-www-form-urlencodedで。 Content-Typeヘッダーフィールドをapplication/jsonに設定していません。 – mrkbxt

+0

Omfg、私は実際にこれを理解しようと3時間を費やしました.T out ... 1つの方法は機能しませんでした。私もこれを無視したからです。-_- – murphguy

答えて

1

何@mrkbxt言いました。構文がどのように違うのかという問題ではありませんが、要求に応じて送信するデータの種類が異なります。 UTF8文字列でエンコードされたテキストは、NSMutableURLRequestコンテンツタイプのデフォルト値です。そのため、最初のリクエストが機能します。本文でJSONを使用するには、JSONを使用するようにコンテンツタイプを切り替える必要があります。それはJSONを受け入れるよう

はあなたの要求オブジェクトに次の行を追加します。

request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
+0

ええ、私はそれを試みましたが、何も変えない。 JSの例でリクエストを見ると、 'x-www-form-urlencoded'でもあるので、コンテンツタイプを指定しないと、jsオブジェクトからUTF8文字列エンコードされたテキストに変換されているかもしれません。 ..私のサーバーはjsonをまったく受け入れないかもしれません...私は報告します。 – jake

+0

それはそれだった、私は要求の間違った部分を見ていた。みんなありがとう! – jake