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
Đ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
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