2013-02-28 42 views
6

Tôi có vấn đề sau: Tôi đang tạo một yêu cầu SOAP rất lớn (dữ liệu là video được mã hóa thành chuỗi Base64) và do đó tôi không thể gửi yêu cầu SOAP thô nhưng thay vào đó cần phải gửi nó trong các khối HTTP 1.1. Tôi dường như không thể tìm ra cách để làm điều đó. Tôi đã sử dụng mã tại đây: What are alternatives to NSURLConnection for chunked transfer encoding nhưng dường như không làm những gì tôi nghĩ - tôi có thể thấy rằng yêu cầu đến trên máy chủ là yêu cầu đơn thay vì nhiều khối (Tôi đang sử dụng WireShark trên máy chủ để xem lưu lượng truy cập đến.)Gửi các yêu cầu HTTP 1.1 chunked trong Objective-C

Tôi biết rằng chức năng tương tự trên Android hoạt động bằng cách sử dụng thư viện HTTP Foundations HTTP cho Java - với các yêu cầu HTTP này, có yêu cầu HTTP không được chỉ định trước được truyền dưới dạng HTTP 1.1 Yêu cầu chunked - và tôi có thể thấy thực sự những yêu cầu đến trên máy chủ như là những phần riêng lẻ ... Tôi muốn mô phỏng điều đó.

(UPDATE:. Dường như với tôi AFNetworking có thể có các chức năng, nhưng tôi không tìm thấy bất kỳ ví dụ như làm thế nào để sử dụng nó)

Đây là mã của tôi, nhiều hơn hoặc ít hơn:

NSString *soapBody = ....; //some correctly formed SOAP request XML here 


NSURL *url = [NSURL URLWithString:...]; 
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; 
[request addValue: ... forHTTPHeaderField:@"SOAPAction"]; 
[request setHTTPMethod:@"POST"]; 
[request addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:[soapBody dataUsingEncoding:NSUTF8StringEncoding]]; 
ChunkedTransferConnection* connection = [ChunkedTransferConnection alloc]; 
[connection establishConnectionWithRequest:request]; 

nơi thực hiện ChunkedTransferConnection là sau

@implementation ChunkedTransferConnection 

    @synthesize p_connection; 
    @synthesize p_responseData; 

    - (void)establishConnectionWithRequest:(NSMutableURLRequest *)request 
    { 
     self.p_responseData = [[NSMutableData alloc] initWithLength:0] ; 
     self.p_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
    } 
... 
@end 
+0

Chuỗi bạn đang liên kết đến là về * nhận * dữ liệu được chunked, chứ không phải về * đăng dữ liệu * đã chunked. - Như tôi đã hiểu (tôi có thể sai), lợi thế duy nhất của mã hóa chuyển mã chunked là bạn không cần biết trước về kích thước nội dung. Nhưng nếu bạn có 'soapBody' làm đối tượng chuỗi hoặc dữ liệu thì bạn biết kích thước, vậy tại sao bạn muốn sử dụng mã hóa chunked? - Nhưng có lẽ tôi hiểu nhầm điều gì đó. –

+0

Cảm ơn, Martin, vâng, tôi đồng ý, chủ đề đó là về việc nhận. Lý do tôi quan tâm đến việc gửi là khi yêu cầu quá lớn và đến như một yêu cầu SOAP "thô" duy nhất, máy chủ không thể xử lý nó. Tôi không chắc chắn tại sao nhưng điều này có vẻ là một thực tế của cuộc sống - nó chỉ đơn giản là thả nó. Tôi không đủ tiên tiến để biết tại sao máy chủ lại hoạt động như vậy. Nhưng tôi biết rằng khi yêu cầu được chia thành các khối HTTP 1.1, máy chủ có thể xử lý nó tốt - tôi có mã Android làm điều đó và nó hoạt động. Vì vậy, tôi đang cố gắng làm như vậy. – PeterD

+0

Một lý do khác để sử dụng các yêu cầu chunked cho tôi là nếu video trở nên rất lớn, sau đó thay vì tải tất cả vào bộ nhớ và mã hóa và gửi, tôi có thể tải nó ở các bộ phận, mã hóa nó trong các bộ phận và gửi những phần đó. Vì vậy, tôi sẽ không có vấn đề giữ vật thể lớn trong bộ nhớ. – PeterD

Trả lời

4

đặn nó ra:

NSInputStream *dataStream = [NSInputStream inputStreamWithData:[soapBody dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBodyStream:dataStream]; 

Điều này khiến yêu cầu tự động nằm trong các khối HTP 1.1!

+4

Kích thước có được xác định không? – Morkrom

+1

giải pháp cuối cùng của bạn có sử dụng AFNetworking hoặc lớp ChunkedTransferConnection của riêng bạn không? bạn có thể chia sẻ không? – Anona112

+0

@ Anona112 Tôi sử dụng NSURLConnection, bạn có biết một số cách để chỉ định kích thước đoạn. Để biết thêm chi tiết, hãy xem http://stackoverflow.com/questions/33775734/how-to-specify-http-chunked-size-for-nsurlconnection –

Các vấn đề liên quan