2016-10-27 2 views
0

이 작업을 수행하는 데 매우 힘들어하고 있습니다. Getting Started sectionAlamofire 및 BOX API를 사용하여 다중 파트 양식 업로드

Xcode 8, Swift 3 및 Alamofire 4 프레임 워크를 사용하고 있습니다. 해당 API 지침에 따라 Box에 파일을 업로드하려고합니다. 내가 봤 거든 검색 오버플로 스택. 나는 가까이에있는 것처럼 느껴지지만 파일은 여전히 ​​작동하지 않습니다.

[결과] : SUCCESS :

내가 말하는 BOX의 API에서 오류가 계속 { 코드 = "bad_request"; "CONTEXT_INFO"= { 오차 = ( { 메시지 = " '부모'가 필요하다", NAME = 부모; 이유 = "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가 API를 거부하는 이유를 모르겠습니다. – Lavvo

+0

Gotcha. [Fiddler] (http://www.telerik.com/blogs/introducing-fiddler-for-os-x-beta-1)와 같은 것을 사용하여 요청의 HTTP 추적을 캡쳐하여 철사. 코드가 옳은 것처럼 보이지만 직렬화 문제가 분명하지 않을 수 있습니다. –

+0

나는이 문제에서 내가 할 수있는 모든 것을 던진 후에 마침내 그것이 작동하도록했다. 해결책은 꽤 놀라운 일이지만 효과가있었습니다. 곧 해결책을 게시 할 것입니다. – Lavvo

관련 문제