[解決済み] iOS で HTTP POST リクエストを送信する
質問
開発中のiOSアプリでHTTP Postを送信しようとしていますが、(urlconnectionから)応答としてコード200を得るものの、pushがサーバーに到達しません。サーバーからの応答もなく、サーバーが私の投稿を検出することもありません (サーバーはアンドロイドからの投稿を検出します)。
私はARCを使用していますが、pdとurlConnectionはstrongに設定されています。
これはリクエストを送信するための私のコードです。
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",dk.baseURL,@"daantest"]]];
[request setHTTPMethod:@"POST"];
[request setValue:@"text/xml"
forHTTPHeaderField:@"Content-type"];
NSString *sendString = @"<data><item>Item 1</item><item>Item 2</item></data>";
[request setValue:[NSString stringWithFormat:@"%d", [sendString length]] forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:[sendString dataUsingEncoding:NSUTF8StringEncoding]];
PushDelegate *pushd = [[PushDelegate alloc] init];
pd = pushd;
urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:pd];
[urlConnection start];
これは私のデリゲート用のコードです。
#import "PushDelegate.h"
@implementation PushDelegate
@synthesize data;
-(id) init
{
if(self = [super init])
{
data = [[NSMutableData alloc]init];
[data setLength:0];
}
return self;
}
- (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten
{
NSLog(@"didwriteData push");
}
- (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes
{
NSLog(@"connectionDidResumeDownloading push");
}
- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
{
NSLog(@"didfinish push @push %@",data);
}
- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
NSLog(@"did send body");
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[self.data setLength:0];
NSHTTPURLResponse *resp= (NSHTTPURLResponse *) response;
NSLog(@"got response with status @push %d",[resp statusCode]);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d
{
[self.data appendData:d];
NSLog(@"recieved data @push %@", data);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
NSLog(@"didfinishLoading%@",responseText);
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error ", @"")
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", @"")
otherButtonTitles:nil] show];
NSLog(@"failed &push");
}
// Handle basic authentication challenge if needed
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"credentials requested");
NSString *username = @"username";
NSString *password = @"password";
NSURLCredential *credential = [NSURLCredential credentialWithUser:username
password:password
persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
@end
コンソールは常に次の行と次の行だけを表示します。
2013-04-01 20:35:04.341 ApprenticeXM[3423:907] did send body
2013-04-01 20:35:04.481 ApprenticeXM[3423:907] got response with status @push 200
2013-04-01 20:35:04.484 ApprenticeXM[3423:907] didfinish push @push <>
どのように解決するのですか?
以下のコードでは、簡単な例として
POST
メソッドを使っています(
によってデータを渡す方法
POST
メソッド
)
ここでは、POSTメソッドの使い方を説明します。
1. 投稿文字列に実際のユーザー名とパスワードを設定します。
NSString *post = [NSString stringWithFormat:@"Username=%@&Password=%@",@"username",@"password"];
2.
投稿文字列をエンコードするには
NSASCIIStringEncoding
でエンコードし、さらにNSData形式で送信する必要があるpost文字列を指定します。
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
実際のデータの長さを送信する必要があります。投稿文字列の長さを計算します。
NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]];
3.
のようなすべてのプロパティを持つUrlrequestを作成します。
HTTP
メソッド、httpヘッダーフィールド、投稿文字列の長さなどのすべてのプロパティを含むUrlrequestを作成します。作成
URLRequest
オブジェクトを作成し、それを初期化します。
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
そのリクエストにデータを送信するUrlを設定します。
[request setURL:[NSURL URLWithString:@"http://www.abcde.com/xyz/login.aspx"]];
では HTTP メソッド ( POST または GET ). この行をそのままあなたのコードに書いてください。
[request setHTTPMethod:@"POST"];
設定
HTTP
ヘッダーフィールドに投稿データの長さを設定します。
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
HTTPヘッダFieldのEncode値も設定します。
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
を設定します。
HTTPBody
をpostDataで設定します。
[request setHTTPBody:postData];
4. ここで、URLConnectionオブジェクトを作成します。これをURLRequestで初期化します。
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
初期化されたurl接続を返し、urlリクエストのデータの読み込みを開始します。を実行したかどうかを確認することができます。
URL
接続が適切に行なわれているかどうかは
if/else
ステートメントを使用します。
if(conn) {
NSLog(@"Connection Successful");
} else {
NSLog(@"Connection could not be made");
}
5. HTTPリクエストからデータを受け取るには、URLConnectionクラスリファレンスで提供されているデリゲートメソッドを使用します。 デリゲートメソッドは以下の通りです。
// This method is used to receive the data which we get using post method.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data
// This method receives the error report in case of connection is not made to server.
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
// This method is used to process the data after connection has made successfully.
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
こちらもご覧ください
これは
と
これは
ドキュメント
に対して
POST
メソッドを使用します。
そして、最も良い例として、ソースコードに HTTPPostメソッドです。
関連
-
[解決済み] トランスポートセキュリティがクリアテキストのHTTPをブロックしています。
-
[解決済み] Firefox または Chrome ブラウザから HTTP POST リクエストを手動で送信する方法
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] Node.jsでPOSTデータを処理する方法は?
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] PHP、cURL、HTTP POSTの例?
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] Swiftで配列に要素を追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] 文字列の長さを取得する
-
[解決済み] NSの接頭辞はどういう意味ですか?
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] iOSシミュレータでスクリーンショットを撮る
-
[解決済み] iPhone 5の画面解像度に対応したアプリを開発・移行するには?
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] Swift 3でディスパッチキューを作成する方法
-
[解決済み] NSURLRequestがデータをキャッシュしないようにしたり、リクエスト後にキャッシュされたデータを削除することは可能ですか?