2016-10-27 12 views
0

これを動作させるのに非常に苦労しています。 Getting Started sectionAlamofireとBOX APIを使用した複数パート形式のアップロード

私はXcode 8、Swift 3、Alamofire 4フレームワークを使用しています。私はグーグルとスタックのオーバーフローを検索しました。私は近くにいるように感じるが、ファイルはまだそれが動作していないアップロードする。

私が言っBOXのAPIからエラーを取得しておいてください。

[結果]:SUCCESS:{ コード= "bad_request"。 "CONTEXT_INFO" = {​​ 誤差=( {メッセージ= " '親' が必要とされる"; 名=親と、 理由= "missing_parameter";} )。 };

ここでは私のコード

func testUpload() { 


    let endpoint = "https://upload.box.com/api/2.0/files/content" 

    let headers: HTTPHeaders = [ 
     "Authorization": "Bearer \(tempDeveloperToken)" 
    ] 

    let jsonAttributes = JSON(["name": "test.pdf", "parent": ["id": "11774646649"]]) 
    let file = PDFService.getPDF(named: "document")   //Returns file as URL 

    let paramAttributes = jsonAttributes.stringValue.data(using: String.Encoding.utf8) 

    Alamofire.upload(
     multipartFormData: { multipartFormData in 
      multipartFormData.append(paramAttributes!, withName: "attributes") 
      multipartFormData.append(file, withName: "file") 
     }, 
     to: endpoint, 
     method: .post, 
     headers: headers, 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
       upload.responseJSON { response in 
        debugPrint(response) 
       } 
      case .failure(let encodingError): 
       print(encodingError) 
      } 
     } 
    ) 

} 

である私は、私が何をしないのです、アップロードにPARAMSを追加取得するためのさまざまな方法を試してみましたか?

+0

最終的にそれを見つけ出し、独自の質問で回答しました。以下の解決策を参照してください。 – Lavvo

答えて

1

多くの試行錯誤の後、このことを見て何が起こっているかを見て、私はついにそれを働かせました。パラメータをJSON文字列として渡すのではなく、指定されたドキュメントとして残すことにしましたが、エンコードする前に文字列のすべての二重引用符を手動でエスケープしました。私の解決策では、という新しい変数 "retest" "jsonAttributes"を置き換える修正であるを作成しました。私はこのソリューションを書くためのより良い方法があるのか​​どうかはわかりませんが、これは私のために働いていました。

func testUpload() { 

    let endpoint = "https://upload.box.com/api/2.0/files/content" 

    let headers: HTTPHeaders = [ 
     "Authorization": "Bearer \(tempDeveloperToken)" 
    ] 

    //let jsonAttributes = JSON(["name": "test.pdf", "parent": ["id": "11774646649"]]) 
    let retest = "{\"name\":\"test.pdf\", \"parent\":{\"id\":\"11774646649\"}}" 
    let paramAttributes = retest.data(using: String.Encoding.utf8) //jsonAttributes.stringValue.data(using: String.Encoding.utf8) 

    let file = PDFService.getPDF(named: "document")   //Returns file as URL 


    Alamofire.upload(
     multipartFormData: { multipartFormData in 
      multipartFormData.append(paramAttributes!, withName: "attributes") 
      multipartFormData.append(file, withName: "file") 
     }, 
     to: endpoint, 
     method: .post, 
     headers: headers, 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
       upload.responseJSON { response in 
        debugPrint(response) 
       } 
      case .failure(let encodingError): 
       print(encodingError) 
      } 
     } 
    ) 

} 
0

マルチパートフォームが正しく表示されます。 parentヘッダーを削除してみてください。そこにいる必要はありません。

+0

ooops、親のヘッダーは削除するのを忘れたものでした。私はそれを削除しましたが、問題ではないようです。これは私のすべての研究に基づいて、私のコードが正しいように見えます。なぜAPIがそれを拒否しているのか分かりません。 – Lavvo

+0

Gotcha。 [Fiddler](http://www.telerik.com/blogs/introducing-fiddler-for-os-x-beta-1)のようなものを使用してリクエストのHTTPトレースをキャプチャして、何が起こっているのかを確認してくださいワイヤ。あなたのコードは正しいのですが、明白ではないシリアル化の問題があります。 –

+0

私はこの問題でできることをすべて投げた後、ついにそれを働かせました。解決策はかなり驚くべきことですが、うまくいきました。すぐに解決策を投稿します。 – Lavvo

関連する問題