2011-10-12 21 views
9

Tôi đang cố gắng gửi một bài đăng nhiều dòng từ iPhone/iPad đến dịch vụ php, vấn đề là vì một số lý do, Loại Nội dung POST dường như là ứng dụng/x-www-form-urlenconded, (tôi phát hiện ra này sử dụng Wireshark)

Điều này thực sự là một đoạn chụp gói Wireshark POST:

**Content-Type: application/x-www-form-urlencoded\r\n** 
    Content-Length: 324\r\n 
     [Content length: 324] 
    Connection: keep-alive\r\n 
    \r\n 
    [Full request URI: http://my.server.com/mobile/tools/authentication] 
Line-based text data: application/x-www-form-urlencoded 
    --0xKhTmLbOuNdArY\r\n 
    Content-Disposition: form-data; name="login"\r\n 
    \r\n 
    [email protected]\r\n 
    --0xKhTmLbOuNdArY\r\n 
    Content-Disposition: form-data; name="password"\r\n 
    \r\n 
    somepassword\r\n 
    --0xKhTmLbOuNdArY\r\n 
    \r\n 
    --0xKhTmLbOuNdArY--\r\n 

vấn đề là ở máy chủ tôi đang cố gắng để đọc các biến đăng nhập và mật khẩu từ này POST yêu cầu, nhưng nó không thể vì tôi nghĩ rằng php nghĩ rằng yêu cầu POST là x-www-form-urlencoded, vì vậy nếu tôi thiết lập authentication.php để làm:

<?php 
echo("<pre>") 
print_r($_POST) 
echo("</pre>") 
?> 

tôi có được điều này:

<pre>Array\n 
(\n 
    [--0xKhTmLbOuNdArY\r\n 
Content-Disposition:_form-data;_name] => "login"\r\n 
\r\n 
[email protected]\r\n 
--0xKhTmLbOuNdArY\r\n 
Content-Disposition: form-data; name="password"\r\n 
\r\n 
somepassword\r\n 
--0xKhTmLbOuNdArY\r\n 
\r\n 
--0xKhTmLbOuNdArY--\r\n 
\n 
)\n 
</pre> 

Đây rõ ràng là không tốt, vì Nếu tôi gửi một yêu cầu sử dụng mẫu đơn này html đơn giản:

<FORM action="http://my.server.com/mobile/tools/authentication.php" method="post"> 
    <P> 
    <LABEL for="login">E-mail: </LABEL> 
      <INPUT type="text" name="login"><BR> 
    <LABEL for="password">pass: </LABEL> 
      <INPUT type="text" name="password"><BR> 
    <INPUT type="submit" value="Send"> <INPUT type="reset"> 
    </P> 
</FORM> 

tôi nhận được dấu vết Wireshark này như mong đợi từ một form:

Content-Type: application/x-www-form-urlencoded\r\n 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n 
    Accept-Encoding: gzip,deflate,sdch\r\n 
    Accept-Language: en-US,en;q=0.8\r\n 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n 
    Cookie: PHPSESSID=tpp10pbrdkkf5dg9qprlamfuu2\r\n 
    \r\n 
    [Full request URI: http://mymed2.sophia.inria.fr/mobile/tools/authentication.php] 
Line-based text data: application/x-www-form-urlencoded 
    login=hello%40hello.com&password=somepassword 

Và văn bản này xuất từ ​​print_r($_POST) trong authentication.php

<pre>Array\n 
(\n 
    [login] => [email protected]\n 
    [password] => somepassword\n 
)\n 
</pre> 

Đây là cách tôi crafting yêu cầu POST trong Objective-C và Cocoa

- (NSMutableURLRequest *) POSTRequestWithURL:(NSURL *)url andDataDictionary:(NSDictionary *) dictionary 
{ 
    // Create a POST request 
    NSMutableURLRequest *myMedRequest = [NSMutableURLRequest requestWithURL:url]; 
    [myMedRequest setHTTPMethod:@"POST"]; 

    // Add HTTP header info 
    // Note: POST boundaries are described here: http://www.vivtek.com/rfc1867.html 
    // and here http://www.w3.org/TR/html4/interact/forms.html 
    NSString *POSTBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"]; 
    [myMedRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n", POSTBoundary] forHTTPHeaderField:@"Content-Type"]; 

    // Add HTTP Body 
    NSMutableData *POSTBody = [NSMutableData data]; 
    [POSTBody appendData:[[NSString stringWithFormat:@"--%@\r\n",POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // Add Key/Values to the Body 
    NSEnumerator *enumerator = [dictionary keyEnumerator]; 
    NSString *key; 

    while ((key = [enumerator nextObject])) { 
     [POSTBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [POSTBody appendData:[[NSString stringWithFormat:@"%@", [dictionary objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [POSTBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 

    // Add the closing -- to the POST Form 
    [POSTBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // Add the body to the myMedRequest & return 
    [myMedRequest setHTTPBody:POSTBody]; 
    return myMedRequest; 
} 

Như bạn thấy, trong đầu tôi làm:

[myMedRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n", POSTBoundary] forHTTPHeaderField:@"Content-Type"]; 

Nhưng trong các bản ghi theo dõi Wireshark trước đó, gói POST đã được xem là Kiểu Nội dung: application/x-www-form-urlencoded, có lẽ tôi đang làm điều gì khác sai?

Cảm ơn :)

EDIT: Tôi muốn tránh các khuôn khổ bên ngoài như ASIHTTPRequest, bằng cách này, sự phát triển ASIHTTPRequest đã bị bỏ rơi bởi nhà phát triển chính như đã nêu here

+0

Điều duy nhất tôi có thể nghĩ đến: tại sao bạn viết thủ công một yêu cầu http? Đó không phải là những gì API dành cho? – CodeCaster

+0

NSMutableURLRequest là "API" được cung cấp, có một số khung công tác để thực hiện việc này, nhưng tôi đang cố gắng tránh các khung bên ngoài. – Goles

Trả lời

19

Ok, vì tôi không thể tìm thấy một giải pháp không có thư viện bên ngoài, tôi đã sửa mã của mình và open sourced nó, trong trường hợp ai đó muốn sử dụng nó.

Vấn đề về mã tôi đăng là \ r \ n trên dòng

[myMedRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n", POSTBoundary] forHTTPHeaderField:@"Content-Type"]; 

Loại bỏ tất cả mọi thứ mà cố định.

Hy vọng điều này sẽ giúp người khác :)

+0

liên kết bị hỏng. bạn có thể cập nhật nó không? –

+0

Đã cập nhật. Làm thế nào hỗ trợ PUT/DELETE/PATCH quá. :) – Goles

+0

Cảm ơn! Tôi đã thử nó. nó có thể xử lý một từ điển lồng nhau không?Tôi đang cố gắng để đăng một hình ảnh bao gồm một từ điển "nhập cảnh" ở cấp cơ sở, sau đó mô tả, journal_id, và hình ảnh ở cấp độ lồng nhau. –

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