iOS 개발 - PUT를 통한 데이터 업로드 요청

5266 단어 iosPut 요청
일반적인 서버에서 데이터를 업로드하는 것은 일반적으로 POST 요청으로 AFNetworking의 POST 요청을 통해 안정적이지만 어느 날 문제가 발생했습니다. 서버에서 데이터를 업로드하는 것은 PUT 요청으로 이루어집니다. AFNetworking으로 데이터를 업로드하는 것이 그렇게 좋지 않다는 것을 발견했습니다. 오늘은 PUT 요청을 통해 데이터를 업로드하는 방법에 대해 말씀드리겠습니다.

PUT 요청


PUT 요청은 요청 서버에 자원을 저장하고 Request-URI를 표지로 하는 것으로 POST와 유사하지만 자주 사용하지 않기 때문에 PUT 요청은 비교적 드물다.HTML 폼도 이것을 지원하지 않습니다.본질적으로 말하자면 PUT와 POST는 매우 비슷하다. 모두 서버에 데이터를 보내지만 그들 사이에는 중요한 차이가 있다. PUT는 일반적으로 자원의 저장 위치를 지정하지만 POST는 없다. POST의 데이터 저장 위치는 서버가 스스로 결정한다.예를 들어 블로그를 제출하는 URL과 같이/addBlog.만약 PUT를 사용한다면 제출한 URL은 다음과 같을 것이다. "/addBlog/abc123"중에서 abc123이 바로 이 블로그의 주소이다.POST를 사용하면 이 주소는 제출 후 서버에서 클라이언트에게 알려줍니다.현재 대부분의 블로그는 이렇다.분명히 PUT와 POST는 용도가 다릅니다.구체적으로 어느 것을 쓰는지는 현재의 업무 장면에 달려 있다.

POST와 PUT 요청의 근본적 차이


어떤 관점에서는 POST로 자원을 만들고 PUT로 자원을 업데이트해야 한다고 주장한다.어떤 관점에서는 PUT로 자원을 만들고 POST로 자원을 업데이트해야 한다고 주장한다.PUT와 POST 중 어느 하나로도 자원을 만들거나 업데이트할 수 있다는 견해도 있다.이런 관점들은 모두 스타일만 보았고 논쟁하기 시작하면 어떤 스타일이 더 좋은지 논쟁할 뿐이다. 사실 PUT인지 POST인지는 이것이 창설인지 자원을 갱신하는 동작인지를 보는 것이 아니라 스타일의 문제가 아니라 의미의 문제이다.HTTP에서 PUT는 idempotent의 방법으로 정의되고 POST는 그렇지 않다. 이것은 매우 중요한 차이점이다.

코드에서 어떻게 응용합니까


먼저 AFNetworking에서 PUT와 POST 방법을 살펴보겠습니다.
//POST 
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(nullable id)parameters constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block progress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure; //PUT  - (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

발견 매개 변수 중 URLStringparameters만 POST 요청에 비해 formData의 매개 변수가 하나 없어져서 데이터를 연결할 곳이 없습니다. 저는 데이터를parameters에 넣는 것은 좋지 않습니다. 인터넷에서 많이 검색했지만 적당한 해결 방법을 찾지 못해 다른 방식으로 바꿀 수 밖에 없습니다.

해결 방법


AFNetworking으로 PUT 요청이 잘 안 된 후에 시스템 NSURLSessionTask를 통해 PUT 요청이 이루어질지 생각해 봤지만 내가 쓰기가 너무 번거롭다고 생각해서 ASIHTTPREquest로 시도해 봤는데 ASIHTTPREquest가 여전히 잘 쓰이는 것 같아서 아래에 코드를 붙였다.
- (void)uploadData:(NSData *)data uploadUrl:(NSString *)uploadUrl {    
    ASIHTTPRequest * fileUpRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:uploadUrl]];
    fileUpRequest.delegate = self;
    // 60 
    [fileUpRequest setTimeOutSeconds:60.f];
    // 
    [fileUpRequest setNumberOfTimesToRetryOnTimeout:2];
    // data 
    [fileUpRequest appendPostData:data];
    // PUT
    [fileUpRequest setRequestMethod:@"PUT"];
    // 
    [fileUpRequest setDidFailSelector:@selector(uploadFailed:)];
    // 
    [fileUpRequest setDidFinishSelector:@selector(uploadFinished:)];
    // 
    fileUpRequest.showAccurateProgress = YES;
    // 
    [fileUpRequest startAsynchronous];
}

여기까지 제 문제는 이미 해결되었습니다. 만약 여러분이 저에게 메시지를 남겨 해결해 주실 수 있다면 지지해 주셔서 감사합니다.
내 GitHub 주소 내 개인 블로그

좋은 웹페이지 즐겨찾기