Swift - POST 请求在服务器上识别为 GET

Posted

技术标签:

【中文标题】Swift - POST 请求在服务器上识别为 GET【英文标题】:Swift - POST request recognises as GET on server 【发布时间】:2015-04-09 05:05:44 【问题描述】:

制作一个从 Swift 到 Apache/php 的简单 POST 请求。

Swift 代码:

let request = NSMutableURLRequest(URL: NSURL(string: "http://dzr.lenyapugachev.ru/createMember")!)
request.HTTPMethod = "POST"
let postString = "id=13&name=Jack"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
        data, response, error in

     if error != nil 
         println("error=\(error)")
         return
     

     println("response = \(response)")

     let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString)")

task.resume()

PHP:

<?php

echo $_SERVER['REQUEST_METHOD']."\n";
var_dump($_POST);

?>

输出:

GET
array(0) 

因此,它不充当服务器的 POST。我也试过 Alamofire 和 SwiftHTTP,效果一样。

请好心人帮忙。

【问题讨论】:

用wireshark之​​类的检查一下,但我几乎可以保证这段代码会导致向服务器发出一个POST请求。我猜想重定向很时髦。 【参考方案1】:

确实是一个 HTTP POST 请求。你的代码没有错。使用Charles(HTPP 调试代理)我看到您的请求被重定向(301 HTTP)

您需要修复服务器的代码/.httpaccess 配置

请求:

POST /createMember HTTP/1.1
Host    dzr.lenyapugachev.ru
Accept-Encoding gzip, deflate
Content-Type    application/x-www-form-urlencoded
Content-Length  15
Accept-Language en-us
Accept  */*
Connection  keep-alive
User-Agent  29530174/1 CFNetwork/711.2.23 Darwin/13.4.0

回复:

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://dzr.lenyapugachev.ru/createMember/">here</a>.</p>
</body></html>

【讨论】:

【参考方案2】:

检查您的网址 对于 PHP 服务器,它应该是 .Php 文件

用作 let request = NSMutableURLRequest(URL: NSURL(string: "http://dzr.lenyapugachev.ru/createMember.php")!)

如果你发送参数你的 php 服务器请求,比如

let request = NSMutableURLRequest(URL: NSURL(string: "http://dzr.lenyapugachev.ru/createMember.php?id=13&name=Jack")!)

请参考本教程,它包含 php 和 swift 代码以发送 post 请求 TUTORIAL: POST TO WEB SERVER API IN SWIFT USING NSURLCONNECTION

【讨论】:

是的,我忘了在地址末尾加斜杠:url 应该是dzr.lenyapugachev.ru/createMember 而不是 /createMember 但是,你的答案的第二部分不是必需的,它不是获取请求。无论如何,非常感谢。

以上是关于Swift - POST 请求在服务器上识别为 GET的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 的 POST 请求中发送表单数据

如何在 Swift 中发出 NSURLSession POST 请求

在 swift2 中使用 Alamofire pod 时 POST 请求不起作用?

Swift3.0:Get/Post同步和异步请求

使用 POST 请求 iOS Swift 3 发送嵌套 JSON

如何使用 swift 2.0 制作 http post json 请求参数